将NodaTime转换为Unix时间戳以及LocalDateTime的重要性

the*_*age 3 c# nodatime

我目前正在使用NodaTime,这是基于我在C#DateTime课堂上处理时区的挫败感.到目前为止,我真的很高兴.

public static string nodaTimeTest(string input)
{
    var defaultValue = new OffsetDateTime(new LocalDateTime(2000, 1, 1, 0, 0), Offset.Zero);
    var pattern = OffsetDateTimePattern.Create("yyyy-MM-dd'T'HH:mm:sso<m>", CultureInfo.InvariantCulture, defaultValue);
    var result = pattern.Parse(input).Value;

    return result.ToString();
}
Run Code Online (Sandbox Code Playgroud)

我有三个具体问题.以上是我在dateTime字符串中解析的方法.我有一个format字符串,它允许我如何解析输入.我的问题是:


我的意思LocalDateTime(..)是什么?我使用的方法是Matt Johnson的Stack 示例,他带来了日期2000, 1, 1, 0, 0.我觉得这很奇怪,因为我知道大多数日期类使用Epoch时间1970, 1, 1, 0 ,0,所以我改变了我的方法以包含Epoch日期,但输出是相同的:

在此输入图像描述


如何将时间转换为Unix时间戳?它似乎没有内置的方法.


使用此方法:

    public static string nodaTimeTest6(string input, int timeZone)
    {
        // var defaultValue = new OffsetDateTime(new LocalDateTime(2000, 1, 1, 0, 0), Offset.Zero);
        var defaultValue = new OffsetDateTime(new LocalDateTime(2000, 1, 1, 0, 0), Offset.FromHours(timeZone));
        var pattern = OffsetDateTimePattern.Create("yyyy-MM-dd'T'HH:mm:sso<m>", CultureInfo.InvariantCulture, defaultValue);
        var result = pattern.Parse(input);

        return result.Value.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

我正在用这种方法测试NodaTime的能力 - 具体来说,我想知道我是否可以解析内部定义的HAS偏移的日期/时间,同时,我的timeZone输入也允许输入时区/偏移.有趣的是,我的输入timeZone被忽略了,所以输出中的偏移量nodaTimeTest6是输入日期字符串:

在此输入图像描述

这是理想的行为吗?

Mat*_*int 7

我的LocalDateTime(..)是什么关系?

  • OffsetDateTimePattern.Create方法需要默认值.它仅在解析失败并且result.Success在使用之前未检查时使用result.Value.

  • 其他模式具有不需要默认值的重载(请参阅问题#267).我选择了特定的默认值,2000-01-01T00:00:00.0000000+00:00因为它与您未明确指定默认值时其他模式使用的类似.

  • 但实际上没有任何意义.您可以使用任何您想要的默认值.

如何将时间转换为Unix时间戳?它似乎没有内置的方法.

  • result.Value是一个OffsetDateTime.该Instant类型使用Unix纪元,因此您可以这样做:

    int unixTime = result.Value.ToInstant().Ticks / NodaConstants.TicksPerSecond;
    
    Run Code Online (Sandbox Code Playgroud)
  • 请注意,Unix时间戳精确到最接近的秒.如果您要传递给JavaScript,则需要使用TicksPerMillisecond并将其返回到long.

...我想知道我是否可以在日期/时间内解析内部定义的偏移量,同时,我的timeZone输入也允许输入时区/偏移量.

  • 对不起,但我不完全明白你在这里问的是什么.你能澄清一下吗?

  • 从您提供的代码中,您可能会将默认值的偏移量与输入字符串的偏移量混淆.仅在解析失败时才使用默认值.

  • 如果要控制偏移量而不是将其包含在输入中,则使用a LocalDateTimePattern而不是a OffsetDateTimePattern来进行解析.解析后,您可以将其与特定区域相关联.

  • 另外,请注意您的命名约定. int timeZone没有意义(这是一个偏移,而不是时区).也许int offsetHours,或者更好,Offset timeZoneOffset.

  • 它内置了`Instant.FromSecondsSinceUnixEpoch`或`Instant.FromMillisecondsSinceUnixEpoch`. (2认同)