是否有人知道如何处理DST的灰色地带(当时间不存在时):例如:
DateTime dt = new DateTime(2014,3,30,2,30,0);
TimeZoneInfo tziSV = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
DateTime dtSV =TimeZoneInfo.ConvertTimeToUtc(dt,tziSV);给出错误,当
DateTime dt = new DateTime(2014,3,30,2,30,0);
dt = dt.ToUniversalTime();
dt = TimeZoneInfo.ConvertTimeFromUtc(dt,tziSV);1:30然后3:30。
谢谢
发布于 2014-02-27 06:31:41
我找到了一种通过.net设施来处理这个灰色地带的方法
DateTime dt = new DateTime(2014,3,30,2,30,0);
TimeZoneInfo tziSV = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
if (tziSV.IsInvalidTime(dt))
{
dt = dt.Add(tziSV.GetUtcOffset(dt));
}
DateTime dtSV = TimeZoneInfo.ConvertTimeToUtc(dt,tziSV);发布于 2014-02-26 20:32:37
使用野田时间 :)
这并不能减轻你思考如何处理这个问题的负担--但它允许你指定你想要如何处理它。从根本上说,你被赋予了一个不存在的价值.因此,您可以选择抛出一个错误,也可以选择转换的开始、过渡的结束或某些自定义行为:
例如,“宽大”解析器将返回过渡结束:
using System;
using NodaTime;
class Test
{
static void Main()
{
var local = new LocalDateTime(2014, 3, 30, 2, 30, 0);
var zone = DateTimeZoneProviders.Tzdb["Europe/Paris"];
var zoned = local.InZoneLeniently(zone);
Console.WriteLine(zoned); // 2014-03-30T03:00:00 Europe/Paris (+02)
}
}或者您可以使用内置的解析器返回“就在”转换之前:
using System;
using NodaTime;
using NodaTime.TimeZones;
class Test
{
static void Main()
{
var local = new LocalDateTime(2014, 3, 30, 2, 30, 0);
var zone = DateTimeZoneProviders.Tzdb["Europe/Paris"];
var resolver = Resolvers.CreateMappingResolver(
ambiguousTimeResolver: Resolvers.ReturnEarlier,
skippedTimeResolver: Resolvers.ReturnEndOfIntervalBefore);
var zoned = local.InZone(zone, resolver);
Console.WriteLine(zoned); // 2014-03-30T01:59:59 Europe/Paris (+01)
}
}或者您可以构建自己的解析器(他们只是代表)。
从根本上讲,这取决于您的应用程序如何处理这个问题。这里没有一刀切的答案,你也很难避免在这里丢失数据。(当然,要想记住原始的本地日期/时间,就必须构建自己的数据结构。)
https://stackoverflow.com/questions/22052506
复制相似问题