我有一台在纽约运行的服务器,它以当地时间将DateTime保存到数据库中。
然后我有一个在GMT时区运行的客户端应用程序需要在同一个纽约当地时间保存一个DateTime 我可以使用:
TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"))
或者我需要考虑夏令时?
现在在我的UI中我需要显示2列。 1)数据库中的DateTime和数据库中的DateTime转换为GMT
我该怎么做?
答案 0 :(得分:0)
TimeZoneInfo类应该为您提供所需的信息。
var date = (DateTime)reader[0]; // Retrieve data from database however you normally get it
var est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var utcTime = TimeZoneInfo.ConvertTimeToUtc(date, est);
var localTime = utcTime.ToLocalTime();
编辑:你修改了你的问题,表明你已经查看了TimeZoneInfo,所以这不再增加太多了。但是,要解决Jon提到的模糊时间问题,请查看IsAmbiguousTime()
和GetAmbiguousTimeOffsets()
方法,以便能够检测无法明确转换的值。
答案 1 :(得分:0)
这是一个示例,表明它应该按预期工作。也就是说,它会进行夏令时转换。
DateTime dt1 = new DateTime(2016, 06, 01, 08, 00, 00, DateTimeKind.Unspecified); // Daylight saving time
DateTime dt2 = new DateTime(2016, 12, 01, 08, 00, 00, DateTimeKind.Unspecified); // Standard time
var dt1Converted = TimeZoneInfo.ConvertTimeToUtc(dt1,
TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"));
var dt2Converted = TimeZoneInfo.ConvertTimeToUtc(dt2,
TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"));
var diff1 = (dt1Converted - dt1).TotalHours;
var diff2 = (dt2Converted - dt2).TotalHours;
Console.WriteLine($"dt1: {dt1}, converted: {dt1Converted}, diff: {diff1}");
Console.WriteLine($"dt2: {dt2}, converted: {dt2Converted}, diff: {diff2}");
输出:
dt1: 2016-06-01 08:00:00, converted: 2016-06-01 12:00:00, diff: 4
dt2: 2016-12-01 08:00:00, converted: 2016-12-01 13:00:00, diff: 5
答案 2 :(得分:0)
您是否有可能将其更改为使用DateTimeOffset
?它旨在解决所有这些问题