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"); ParseResultparseResult = 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
在单元测试中替换a的系统时钟.
一定要了解InZoneLeniently
行为方式,并注意它在即将发布的2.0版本中的变化.请参阅2.x迁移指南中的 "Lenient解析器更改" .