3

我目前正在使用 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示例,他的带有 date 2000, 1, 1, 0, 0。我觉得这很奇怪,因为我知道的大多数日期类都使用 Epoch time 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();
    }

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

在此处输入图像描述

这是期望的行为吗?

4

1 回答 1

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;
    
  • 请注意,Unix 时间戳精确到最接近的秒。如果您要传递给 JavaScript,您可能希望TicksPerMillisecondlong.

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

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

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

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

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

于 2014-03-13T20:36:22.367 回答