我試圖用野田時間解析用戶輸入。解析包括tz數據庫時區名稱的用戶輸入
輸入:
- 日期在
YYYY-MM-DD
- 小時
- 分鐘
- TZ數據庫時區名稱的形式(從谷歌的時區API返回)
我需要將此數據轉換爲UTC和其他時區,也基於tz數據庫時區名稱。
目前我試圖理解LocalDateTime
和ZonedDateTime
的差異,但也許有人能夠展示如何做到這一點之前,我會(希望)弄清楚這一點。
我試圖用野田時間解析用戶輸入。解析包括tz數據庫時區名稱的用戶輸入
輸入:
YYYY-MM-DD
我需要將此數據轉換爲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");
}
感謝您的見解。我們仍然必須決定如何處理不明確的值,所以我只在測試程序中使用了'InZoneStrictly'。 – Stijn
@Stijn:只要你意識到可能的問題和可用的選項,我很高興:) –