将NodaTime转换为Unix时间戳以及LocalDateTime的重要性
我目前正在使用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", CultureInfo.InvariantCulture, defaultValue); var result = pattern.Parse(input).Value; return result.ToString(); }
我有三个具体问题。 以上是我在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", CultureInfo.InvariantCulture, defaultValue); var result = pattern.Parse(input); return result.Value.ToString(); }
我正在用这种方法测试NodaTime的能力 – 具体来说,我想知道我是否可以解析内部定义的HAS偏移的日期/时间,同时,我的timeZone
输入也允许输入时区/偏移。 有趣的是,我的输入timeZone
被忽略,因此我输出的nodaTimeTest6
的偏移量是输入日期字符串:
这是理想的行为吗?
我的LocalDateTime(..)是什么关系?
-
OffsetDateTimePattern.Create
方法需要一个默认值。 它仅在解析失败并且在使用result.Value
之前未检查result.Success
使用。 -
其他模式具有不需要默认值的重载(请参阅问题#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,则需要使用
TicksPerMillisecond
并将其返回很long
。
…我想知道我是否可以在日期/时间内解析HAS偏移定义在内部,同时,我的
timeZone
输入也允许输入时区/偏移。
-
对不起,但我不完全明白你在这里问的是什么。 你能澄清一下吗?
-
从您提供的代码中,您可能会将默认值的偏移量与输入字符串的偏移量混淆。 仅在解析失败时才使用默认值。
-
如果要控制偏移量而不是将其包含在输入中,则使用
LocalDateTimePattern
而不是OffsetDateTimePattern
来进行解析。 解析后,您可以将其与特定区域相关联。 -
另外,请注意您的命名约定。
int timeZone
没有意义(这是一个偏移,而不是一个时区)。 也许是int offsetHours
,或者更好的是Offset timeZoneOffset
。