如果计算机上未安装CEST时区,则从CEST / CET日期字符串转换为UTC日期字符串

时间:2018-09-12 10:22:55

标签: c#

我需要解析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;

0 个答案:

没有答案