首页 文章

将UTC DateTime转换为另一个时区

提问于
浏览
27

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

谢谢,马克

5 回答

  • 0

    看看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);
    
  • 20

    最好的方法是使用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 .

  • 29

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

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

    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");
    
  • 12
    //  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();
    

相关问题