簡體   English   中英

將 UTC 日期時間轉換為另一個時區

[英]Convert UTC DateTime to another Time Zone

我有一個來自數據庫記錄的 UTC DateTime 值。 我還有一個用戶指定的時區(TimeZoneInfo 的一個實例)。 如何將該 UTC DateTime 轉換為用戶的本地時區? 另外,如何確定用戶指定的時區當前是否正在觀察 DST? 我正在使用 .NET 3.5。

謝謝,馬克

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

如果要將DateTimeOffset轉換為另一個DateTimeOffset,可以在TimeZoneInfo中使用專用函數:

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

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

對於DST,請參閱TimeZoneInfo.IsDaylightSavingTime方法。

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

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

這是另一個問題:如果您在 Linux 服務器上運行代碼,則需要使用 Linux 系統來獲取時區名稱。 例如,“中央標准時間”將是“美國/芝加哥”。 tz 列表在這里: https : //en.wikipedia.org/wiki/List_of_tz_database_time_zones

下面是一個帶有 isWindows 開關的示例:

public static class DateTimeHelper
{
    public static string ConvertUtcToCst(this string dateTimeString)
    {
        if (string.IsNullOrWhiteSpace(dateTimeString))
        {
            return string.Empty;
        }

        if (DateTime.TryParse(dateTimeString, out DateTime outputDateTime))
        {
            try
            {
                var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
                TimeZoneInfo cstZone = null;
                if (isWindows)
                {
                    cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
                }
                else
                {
                    cstZone = TimeZoneInfo.FindSystemTimeZoneById("America/Chicago");
                }

                var cstDateTime = TimeZoneInfo.ConvertTimeFromUtc(outputDateTime, cstZone);
                return cstDateTime.ToString();
            }
            catch (TimeZoneNotFoundException)
            {
                return "The registry does not define the Central Standard Time zone.";
            }
            catch (InvalidTimeZoneException)
            {
                return "Registry data on the Central Standard Time zone has been corrupted.";
            }
            catch (Exception ex)
            {
                return $"Error :: {ex.Message} :: {ex.ToString()}";
            }
        }

        return string.Empty;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM