我正在尝试使用Noda Time解析用户输入。
输入:
YYYY-MM-DD
形式的日期- 小时
- 分钟
- tz 数据库时区名称(从 Google 的时区 API 返回)
我需要将此数据转换为 UTC 和其他时区,也基于 tz 数据库时区名称。
目前,我正在尝试理解LocalDateTime
和ZonedDateTime
的差异,但也许有人能够在我(希望)弄清楚这一点之前展示如何做到这一点。
你的答案非常接近我会做的 - 但如果你在单独的字符串中有日期、小时和分钟,我会使用:
var zoneProvider = DateTimeZoneProviders.Tzdb;
var sourceZone = zoneProvider.GetZoneOrNull("Europe/Brussels");
var targetZone = zoneProvider.GetZoneOrNull("Australia/Melbourne");
if (sourceZone == null || targetZone == null)
{
Console.WriteLine("Time zone not found");
return;
}
var dateParseResult = LocalDatePattern.IsoPattern.Parse(date);
int hourValue, minuteValue;
if (!dateParseResult.Success ||
!int.TryParse(hour, out hourValue) ||
!int.TryParse(minute, out minuteValue))
{
Console.WriteLine("Parsing failed");
return;
}
var localDateTime = dateParseResult.Value + new LocalTime(hour, minute);
var zonedDateTime = localDateTime.InZoneStrictly(sourceZone);
Console.WriteLine(zonedDateTime.ToInstant());
Console.WriteLine(zonedDateTime);
Console.WriteLine(zonedDateTime.WithZone(targetZone));
这里唯一显着的区别是解析 - 我不会将所有位粘在一起;我只是单独解析字符串。(我也更喜欢失败的"早期退出":)
不过,您应该注意InZoneStrictly
的含义 - 如果输入的本地日期/时间不明确,您是否肯定要失败?
>http://msmvps.com/blogs/jon_skeet/archive/2012/02.aspx 提供了很好的信息,虽然它有点过时,但在官方文档中很容易找到相关的方法名称。
下面是一些演示代码。
string date = "2013-01-22";
string hour = "13";
string minute = "15";
var result = LocalDateTimePattern.ExtendedIsoPattern.Parse(date + "T" + hour + ":" + minute + ":00");
if (result.Success == true)
{
DateTimeZone source_zone = DateTimeZoneProviders.Tzdb.GetZoneOrNull("Europe/Brussels");
DateTimeZone target_zone = DateTimeZoneProviders.Tzdb.GetZoneOrNull("Australia/Melbourne");
if (source_zone != null && target_zone != null)
{
ZonedDateTime source_zoned_dt = result.Value.InZoneStrictly(source_zone);
Console.WriteLine(source_zoned_dt.ToInstant());
Console.WriteLine(source_zoned_dt);
Console.WriteLine(source_zoned_dt.WithZone(target_zone));
}
else
{
Console.WriteLine("time zone not found");
}
}
else
{
Console.WriteLine("parsing failed");
}