【问题标题】:Converting NodaTime to Unix timestamp and the importance of LocalDateTime将 NodaTime 转换为 Unix 时间戳以及 LocalDateTime 的重要性
【发布时间】:2014-03-13 20:01:52
【问题描述】:

我目前正在使用 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(..) 是什么重要吗?我使用的方法是马特约翰逊的堆栈example,他的日期是2000, 1, 1, 0, 0。我觉得这很奇怪,因为我知道的大多数日期类都使用纪元时间1970, 1, 1, 0 ,0,所以我更改了方法以包含纪元日期,但输出是相同的:


如何将时间转换为 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 的能力——具体来说,我想知道我是否可以解析在内部定义了偏移量的日期/时间,同时,我的 timeZone 输入也允许时区/偏移量的输入。有趣的是,我的输入timeZone 被忽略了,所以nodaTimeTest6 输出中的偏移量是输入日期字符串:

这是期望的行为吗?

【问题讨论】:

    标签: c# nodatime


    【解决方案1】:

    我的 LocalDateTime(..) 是什么重要吗?

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

    • 其他模式具有不需要默认值的重载(请参阅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

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

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

    • 从您提供的代码来看,您似乎将默认值的偏移量与输入字符串的偏移量混淆了。仅在解析失败时使用默认值。

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

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

    【讨论】:

    • 1.嗯,如果没关系,那我就用什么都行! 2. 谢谢!会试试这个。 3. 老实说,我不知道/理解偏移量/时区之间的区别;一直认为他们的意思是一样的。
    • 看看the timezone tag wiki。特别是“时区!=偏移”部分。您可能还想阅读相关的the DST tag wiki
    • 非常感谢马特。 Unix 时间转换器完美运行。您是否有一种与 unix 时间完全相反的方法?输入为 unix 时间,输出为日期时间。
    • 内置于Instant.FromSecondsSinceUnixEpochInstant.FromMillisecondsSinceUnixEpoch
    猜你喜欢
    • 2015-12-30
    • 2013-12-14
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2020-10-19
    • 2013-07-02
    • 2020-06-01
    相关资源
    最近更新 更多