c #DataTime:假设EST转换为GTM

时间:2016-08-31 13:20:20

标签: c# .net datetime

我有一台在纽约运行的服务器,它以当地时间将DateTime保存到数据库中。

然后我有一个在GMT时区运行的客户端应用程序需要在同一个纽约当地时间保存一个DateTime 我可以使用:

TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"))

或者我需要考虑夏令时?

现在在我的UI中我需要显示2列。 1)数据库中的DateTime和数据库中的DateTime转换为GMT

我该怎么做?

3 个答案:

答案 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?它旨在解决所有这些问题