将UTC DateTime转换为另一个时区

Mar*_*man 32 c# timezone datetime dst

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

谢谢,马克

Mat*_*int 36

最好的方法就是使用它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);
Run Code Online (Sandbox Code Playgroud)

唯一的问题是传入的DateTime值可能没有DateTimeKind.Local那种.它必须是Utc,或Unspecified.


Erw*_*yer 21

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

DateTimeOffset newTime = TimeZoneInfo.ConvertTime(
    DateTimeOffset.UtcNow, 
    TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
);
Run Code Online (Sandbox Code Playgroud)


dtb*_*dtb 17

看看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);
Run Code Online (Sandbox Code Playgroud)

对于DST,请参阅TimeZoneInfo.IsDaylightSavingTime方法.

bool isDst = southpole.IsDaylightSavingTime(DateTime.UtcNow);
Run Code Online (Sandbox Code Playgroud)

  • 此代码无法编译.该时区Id不存在,如果您将其替换为有效的时区,则会出现"Utc DateTime实例的UTC偏移量必须为0"的错误. (8认同)

Sea*_*ean 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

例:

var currentTimeInPacificTime = DateTime.UtcNow.ConvertUtcTimeToTimeZone("Pacific Standard Time");
Run Code Online (Sandbox Code Playgroud)

  • `static public`?HERESY,BURN THE WITCH (10认同)