Nodatime根据时间和时区创建ZonedDateTime

时间:2015-12-29 23:07:53

标签: c# timezone nodatime

任何人都可以给我最直接的方式来创建ZonedDateTime,给定“下午4:30”和“America / Chicago”。

我希望此对象表示该时区中当前日期的时间。

谢谢!

我尝试了这个......但它实际上给了我一个当地时区的瞬间,它在创建zonedDateTime时会被抵消。

        string time = "4:30pm";
        string timezone = "America/Chicago";
        DateTime dateTime;
        if (DateTime.TryParse(time, out dateTime))
        {
            var instant = new Instant(dateTime.Ticks);
            DateTimeZone tz = DateTimeZoneProviders.Tzdb[timezone];
            var zonedDateTime = instant.InZone(tz);

1 个答案:

答案 0 :(得分:8)

using NodaTime;
using NodaTime.Text;

// your inputs
string time = "4:30pm";
string timezone = "America/Chicago";

// parse the time string using Noda Time's pattern API
LocalTimePattern pattern = LocalTimePattern.CreateWithCurrentCulture("h:mmtt");
ParseResult<LocalTime> parseResult = pattern.Parse(time);
if (!parseResult.Success) {
    // handle parse failure
}
LocalTime localTime = parseResult.Value;

// get the current date in the target time zone
DateTimeZone tz = DateTimeZoneProviders.Tzdb[timezone];
IClock clock = SystemClock.Instance;
Instant now = clock.Now;
LocalDate today = now.InZone(tz).Date;

// combine the date and time
LocalDateTime ldt = today.At(localTime);

// bind it to the time zone
ZonedDateTime result = ldt.InZoneLeniently(tz);

一些注意事项:

  • 我故意将许多项目分成单独的变量,以便您可以看到从一种类型到下一种类型的进展。您可以根据需要压缩它们以减少代码行数。我还使用了显式类型名称。随意使用var

  • 您可能希望将其置于函数中。执行此操作时,应将clock变量作为参数传递。这样您就可以在单元测试中替换FakeClock的系统时钟。

  • 请务必了解InZoneLeniently的行为方式,并注意它在即将发布的2.0版本中的变化情况。请参阅the 2.x migration guide中的“宽容解析器更改”。