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

时间:2014-03-13 20:01:53

标签: 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();
}

我有三个具体问题。上面是我使用的方法,我解析dateTime字符串。我有一个format字符串,它允许我如何解析输入。我的问题是:


我的LocalDateTime(..)是什么关系?我使用的方法是Matt Johnson的Stack example,他的日期为2000, 1, 1, 0, 0。我认为这很奇怪,因为我知道的大多数日期类都使用了纪元时间1970, 1, 1, 0 ,0,所以我改变了我的方法以包含纪元日期,但输出是相同的:

enter image description here


如何将时间转换为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();
    }

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

enter image description here

这是期望的行为吗?

1 个答案:

答案 0 :(得分:7)

  

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

  • OffsetDateTimePattern.Create方法需要默认值。只有在解析失败且您在使用result.Success之前未检查result.Value时才会使用它。

  • 其他模式的重载不需要默认值(请参阅issue #267)。我选择了2000-01-01T00:00:00.0000000+00:00的特定默认值,因为当您没有明确指定默认值时,它与the other patterns use类似。

  • 虽然没有任何意义。您可以使用任何您想要的默认值。

  

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

  • result.ValueOffsetDateTimeInstant类型使用Unix纪元,因此您可以这样做:

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

  

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

  • 抱歉,我不完全明白你在这里问的是什么。你能澄清一下吗?

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

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

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