我目前正在使用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
,所以我改变了我的方法以包含纪元日期,但输出是相同的:
如何将时间转换为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
输出中的偏移量是输入日期字符串:
这是期望的行为吗?
答案 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.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
。