簡體   English   中英

在C#中將UTC日期時間轉換為本地日期時間

[英]Converting UTC DateTime to Local DateTime in C#

我想顯示事件的日期和時間,它將根據用戶的時區進行管理。 要檢查時區,我將系統時區更改為另一個時區,但是我的代碼仍在獲取本地時區。 這是我的代碼

我正在使用Cassendra數據庫和C#.NET MVC

DateTime startTimeFormate = x.Startdate;
DateTime endTimeFormate = x.Enddate;
TimeZone zone = TimeZone.CurrentTimeZone;
DateTime startTime = zone.ToLocalTime(startTimeFormate);
DateTime endTime = zone.ToLocalTime(endTimeFormate);

要將UTC DateTime時間轉換為Local DateTime ,必須使用TimeZoneInfo ,如下所示:

DateTime startTimeFormate = x.Startdate; // This  is utc date time
TimeZoneInfo systemTimeZone = TimeZoneInfo.Local;
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(startTimeFormate, systemTimeZone);

此外,如果要將UTC DateTime時間轉換為用戶特定的Local DateTime請執行以下操作:

string userTimeZoneId = "New Zealand Standard Time";
TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(userTimeZoneId);
DateTime userLocalDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, userTimeZoneId);

注: TimeZone.NET過時的 ,現在,它已經被廢棄了。 而是使用TimeZoneInfo

根據TimeZone.CurrentTimeZone屬性的MSDN文檔,在首次調用TimeZone.CurrentTimeZone之后,將緩存本地時區。 實際上,這意味着只要不支持時區中間運行的動態更新,您的代碼就可以正常運行。 為了立即查看更改,應在調用TimeZone.CurrentTimeZone之前調用

TimeZoneInfo.ClearCachedData();

MSDN文章中對此進行了記錄,如下所示:

來電者須知

在首次使用CurrentTimeZone檢索時區信息之后,將緩存本地時區數據。 如果系統的本地時區隨后發生更改,則CurrentTimeZone屬性不會反映此更改。 如果在應用程序運行時需要處理時區更改,請使用TimeZoneInfo類並調用其ClearCachedData()方法。

這些是我使用的DateTime幫助程序,涵蓋了到目前為止我需要的所有情況。

public static class DateTimeHelpers
  {
    public static DateTime ConvertToUTC(DateTime dateTimeToConvert, string sourceZoneIdentifier)
    {
      TimeZoneInfo sourceTZ = TimeZoneInfo.FindSystemTimeZoneById(sourceZoneIdentifier);
      TimeZoneInfo destinationTZ = TimeZoneInfo.FindSystemTimeZoneById("UTC");

      return TimeZoneInfo.ConvertTime(dateTimeToConvert, sourceTZ, destinationTZ);
    }

    public static DateTime ConvertToTimezone(DateTime utcDateTime, string destinationZoneIdentifier)
    {
      TimeZoneInfo sourceTZ = TimeZoneInfo.FindSystemTimeZoneById("UTC");
      TimeZoneInfo destinazionTZ = TimeZoneInfo.FindSystemTimeZoneById(destinationZoneIdentifier);

      return DateTime.SpecifyKind(TimeZoneInfo.ConvertTime(utcDateTime, sourceTZ, destinazionTZ), DateTimeKind.Local);
    }

    public static DateTime GetCurrentDateTimeInZone(string destinationZoneIdentifier)
    {
      TimeZoneInfo sourceTZ = TimeZoneInfo.FindSystemTimeZoneById("UTC");
      TimeZoneInfo destinazionTZ = TimeZoneInfo.FindSystemTimeZoneById(destinationZoneIdentifier);

      return DateTime.SpecifyKind(TimeZoneInfo.ConvertTime(DateTime.UtcNow, sourceTZ, destinazionTZ), DateTimeKind.Local);
    }
  }

TimeZone.CurrentTimeZoneTimeZoneInfo.LocalToLocalTime使用服務器的本地時區,而不是最終用戶。

相反,首先要了解如何在.NET代碼中可靠地獲取最終用戶的時區

然后,假設您現在有了一個TimeZoneInfo對象,只需使用TimeZoneInfo.ConvertTimeFromUtc方法。

暫無
暫無

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

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