我需要解析CEST / CET中的某些日期,这些日期是来自外部提供程序的字符串,并将它们转换为UTC。
我当前在计算机上使用的文化是en-GB,并且我的计算机上安装了BST时区,但是我没有CEST。因此,由于无法实例化CEST,因此无法使用TimeZoneInfo
在时区之间进行转换。
如何在C#中执行此操作?我在这里在StackOverflow上查看了类似的问题,并在Google上进行了搜索,但找不到有效的解决方案。
目前,我的代码可与此一起使用,但我认为这仍然是黑客:
// dateToParse: "2018-09-04T19:17:37.022363"
var theDate = DateTime.ParseExact(dateToParse,
@"yyyy-MM-ddTHH\:mm\:ss\.ffffff",
new CultureInfo("sq-AL"), // this culture info is in CEST. Tried using CultureInfo.InvariantCulture as well - nothing changed
DateTimeStyles.AssumeLocal); // tried putting here DateTimeStyles.None
// Our local time is in BST.
// CEST and BST are always one hour apart so parsing date during daylight saving times will (probably) still work.
// I think. Except for that 1h window when the switch happens...
theDate = theDate.AddHours(-1); // I was hoping to not need this!
var utcDate = theDate.ToUniversalTime();
return utcDate;
因此,从本质上讲,我正在寻找一种可以理解该日期为CEST或CET的日期,具体取决于一年中的时间,而不是当前的BST时间,并且知道如何将其转换为UTC,并考虑了诸如此类的因素夏令时。
我不介意使用库-我已经非常简短地查看了NodaTime,但是在那里没有找到明显的解决方案(可能很好,但是我没有花时间去可靠地寻找它) 。
任何帮助,我们将不胜感激。
在注释的帮助下并进行了更多搜索之后,此代码似乎运行良好:
var theDate = DateTime.ParseExact(dateToParse,
@"yyyy-MM-ddTHH\:mm\:ss\.ffffff",
CultureInfo.InvariantCulture,
DateTimeStyles.None);
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
var utcDate = TimeZoneInfo.ConvertTimeToUtc(theDate, timeZoneInfo);
return utcDate;