将UTC DateTime转换为另一个时区

时间:2010-03-30 19:54:52

标签: c# datetime timezone dst

我有来自数据库记录的UTC DateTime值。我还有一个用户指定的时区(TimeZoneInfo的一个实例)。如何将UTC DateTime转换为用户的本地时区?另外,如何确定用户指定的时区当前是否正在观察夏令时?我正在使用.NET 3.5。

谢谢, 标记

6 个答案:

答案 0 :(得分:30)

执行此操作的最佳方法是使用TimeZoneInfo.ConvertTimeFromUtc

// you said you had these already
DateTime utc = new DateTime(2014, 6, 4, 12, 34, 0);
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");

// it's a simple one-liner
DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, tzi);

唯一的问题是传入的DateTime值可能没有DateTimeKind.Local种类。它必须是UtcUnspecified

答案 1 :(得分:20)

如果要将DateTimeOffset转换为另一个DateTimeOffset,可以在TimeZoneInfo中使用专用函数:

DateTimeOffset newTime = TimeZoneInfo.ConvertTime(
    DateTimeOffset.UtcNow, 
    TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
);

答案 2 :(得分:19)

查看DateTimeOffset结构:

// user-specified time zone
TimeZoneInfo southPole =
    TimeZoneInfo.FindSystemTimeZoneById("Antarctica/South Pole Standard Time");

// an UTC DateTime
DateTime utcTime = new DateTime(2007, 07, 12, 06, 32, 00, DateTimeKind.Utc);

// DateTime with offset
DateTimeOffset dateAndOffset =
    new DateTimeOffset(utcTime, southPole.GetUtcOffset(utcTime));

Console.WriteLine(dateAndOffset);

对于夏令时,请参阅TimeZoneInfo.IsDaylightSavingTime方法。

bool isDst = southpole.IsDaylightSavingTime(DateTime.UtcNow);

答案 3 :(得分:12)

Antartica答案仅适用于匹配UTC的时区。我对这个DateTimeOffset函数造成了很大的创伤,经过数小时的反复试验,我设法生成了一个适用于所有时区的实用转换扩展函数。

static public class DateTimeFunctions
{
    static public DateTimeOffset ConvertUtcTimeToTimeZone(this DateTime dateTime, string toTimeZoneDesc)
    {
        if (dateTime.Kind != DateTimeKind.Utc) throw new Exception("dateTime needs to have Kind property set to Utc");
        var toUtcOffset = TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc).GetUtcOffset(dateTime);
        var convertedTime = DateTime.SpecifyKind(dateTime.Add(toUtcOffset), DateTimeKind.Unspecified);
        return new DateTimeOffset(convertedTime, toUtcOffset);
    }
}

示例:

var currentTimeInPacificTime = DateTime.UtcNow.ConvertUtcTimeToTimeZone("Pacific Standard Time");

答案 4 :(得分:0)

       //  TO get Currrent Time in current Time Zone of your System

        var dt = DateTime.Now;

        Console.WriteLine(dt);

        // Display Time Zone of your System

        Console.WriteLine(TimeZoneInfo.Local);

        // Convert Current Date Time to UTC Date Time

        var utc = TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local);

        Console.WriteLine(utc);

        // Convert UTC Time to Current Time Zone

        DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, TimeZoneInfo.Local);

        Console.WriteLine(pacific);

        Console.ReadLine();

答案 5 :(得分:0)

这是另一个问题:如果您在 Linux 服务器上运行代码,则需要使用 Linux 系统来获取时区名称。例如,“中央标准时间”将是“美国/芝加哥”。 tz 列表在这里:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

以下是使用 isWindows 开关的示例:

TestFragment