欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

更改.NET中的默認時區(qū)的操作方法

 更新時間:2024年06月17日 08:58:31   作者:VAllen  
除了"在操作系統(tǒng)中修改時區(qū)信息,然后重啟.NET應用程序,使其生效"之外,如何在不修改操作系統(tǒng)時區(qū)的前提下,修改.NET中的默認時區(qū)呢,下面小編給大家分享更改.NET中的默認時區(qū)的操作方法,感興趣的朋友一起看看吧

如何更改.NET中的默認時區(qū)?

除了"在操作系統(tǒng)中修改時區(qū)信息,然后重啟.NET應用程序,使其生效"之外。如何在不修改操作系統(tǒng)時區(qū)的前提下,修改.NET中的默認時區(qū)呢?

這是一位 同學兼同事 于5月21日在技術群里問的問題,我當時簡單地研究了一下,就寫出來了。

現在寫文章分享給大家,雖然我覺得這種需求非常小眾,幾乎不會有人用到。

正文

正常手段下,.NET是不允許開發(fā)者修改默認時區(qū)的,它沒有公開這樣的API。

在 .NET 中,管理時區(qū)的類型叫 TimeZoneInfo,它位于 System 命名空間下,由 System.Private.CoreLib.dll 提供。

使用 ILSpy 反編譯 System.Private.CoreLib.dll,找到 TimeZoneInfo 類型,我們可以看到 TimeZoneInfo.Local 指向一個私有字段 s_cachedData 的成員屬性 Local,該字段類型是一個屬于 TimeZoneInfo 的私有嵌套類型 CachedData。

當首次訪問 CachedData.Local 時,它會先檢查 _localTimeZone 私有字段是否有值。如果沒有值,則調用 CreateLocal 方法從操作系統(tǒng)獲取時區(qū)信息并且賦值。

看到了這里,我腦海里就浮現了兩種方案:

  • 使用 hook 技術挾持并修改 win32 api 返回的時區(qū)信息。
  • 使用 reflection 技術反射并且修改時區(qū)信息。

方案1的優(yōu)點是穩(wěn)定,但可能會被殺毒軟件報毒。

方案2的優(yōu)點是不會報毒,但可能不穩(wěn)定。

為什么說方案2不穩(wěn)定呢?因為 s_cachedData 私有字段值有可能在某個時候被重置。

現在我們來看看方案2的實現:

public static bool TrySetLocalTimeZoneInfo(TimeZoneInfo timeZoneInfo)
{
  Type timeZoneInfoType = typeof(TimeZoneInfo);
  // 獲取TimeZoneInfo類型的私有靜態(tài)字段成員信息s_cachedData
  FieldInfo cachedDataFieldInfo = timeZoneInfoType.GetField("s_cachedData", BindingFlags.NonPublic | BindingFlags.Static);
  if (cachedDataFieldInfo == null)
  {
    return false;
  }
  // 獲取TimeZoneInfo類型的私有嵌套類型CachedData
  Type cachedDataType = timeZoneInfoType.GetNestedType("CachedData", BindingFlags.NonPublic);
  if (cachedDataType == null)
  {
    return false;
  }
  // 獲取CachedData類型的私有字段成員信息_localTimeZone
  FieldInfo localTimeZoneFieldInfo = cachedDataType.GetField("_localTimeZone", BindingFlags.NonPublic | BindingFlags.Instance);
  if (localTimeZoneFieldInfo == null)
  {
    return false;
  }
  // 獲取TimeZoneInfo類型的私有靜態(tài)字段s_cachedData值
  object cachedData = cachedDataFieldInfo.GetValue(null);
  if (cachedData == null)
  {
    return false;
  }
  // 設置私有字段的值
  localTimeZoneFieldInfo.SetValue(cachedData, timeZoneInfo);
  return true;
}

PS: 該方法代碼實際測試在 .NET Core 3.1.NET 5.0.NET 6.0.NET 7.0.NET 8.0 都可以正常工作。

用法:

void Main()
{
  // 設置前
  Console.WriteLine(TimeZoneInfo.Local);
  // 修改為 GMT 時區(qū)
  TimeZoneInfo hkTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
  bool setResult = TrySetLocalTimeZoneInfo(hkTimeZoneInfo);
  // 設置后
  Console.WriteLine(TimeZoneInfo.Local);
}

注意:這種方案需要嚴謹測試,反復驗證。

因為是篡改.NET內部私有變量,不知道是否會引起其它后果。

比如.NET內部其它API沒有使用 TimeZoneInfo.Local,而是自己在其它地方又緩存了一套 TimeZoneInfo,那就GG了。

又比如,需要檢查整個 .NET Runtime 和其它第三方組件,是否有調用 TimeZoneInfo.ClearCachedData 靜態(tài)方法 或者 調用 CultureInfo.ClearCachedData 對象方法。

到此這篇關于如何更改.NET中的默認時區(qū)?的文章就介紹到這了,更多相關.NET默認時區(qū)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 比較簡單的將數據信息導入wrod文檔方案(C# for word)

    比較簡單的將數據信息導入wrod文檔方案(C# for word)

    史上最簡單將數據信息導入wrod文檔方案(C# for word)
    2010-01-01
  • asp.net后臺注冊js的四種方法分享

    asp.net后臺注冊js的四種方法分享

    這篇文章主要介紹了asp.net后臺注冊js的四種方法,有需要的朋友可以參考一下
    2014-01-01
  • 詳解ASP.NET MVC Form表單驗證

    詳解ASP.NET MVC Form表單驗證

    這篇文章主要為大家詳細介紹了ASP.NET MVC Form表單驗證,一般驗證方式有Windows驗證和表單驗證,web項目用得更多的是表單驗證,感興趣的小伙伴們可以參考一下
    2016-03-03
  • vs2010制作簡單的asp.net網站

    vs2010制作簡單的asp.net網站

    這篇文章主要介紹了vs2010制作簡單的asp.net網站,只要十步哦,感興趣的小伙伴們可以參考一下
    2015-09-09
  • .net core下對于附件上傳下載的實現示例

    .net core下對于附件上傳下載的實現示例

    本篇文章主要介紹了.net core下對于附件上傳下載的實現示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • .Net Core讀取Json配置文件的實現示例

    .Net Core讀取Json配置文件的實現示例

    這篇文章主要介紹了.Net Core讀取Json配置文件的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • ASP.NET Cookie 操作實現

    ASP.NET Cookie 操作實現

    本節(jié)中的主題描述如何在 ASP.NET Web 應用程序中創(chuàng)建 Cookie。Cookie 是一些小的文本文件,服務器和瀏覽器在收到每個頁請求時交換它們,您還可以使用這些小文本文件來存儲幫助針對每個用戶自定義您的應用程序的信息。
    2009-11-11
  • .NetCore基礎之讀取配置文件詳解

    .NetCore基礎之讀取配置文件詳解

    在應用程序開發(fā)中,配置文件是主要存儲系統(tǒng)的初始配置信息,配置文件的讀取雖然屬于基礎內容卻又經常用到。本文將詳細為大家介紹.Net?Core?如何讀取配置文件的,需要的可以參考一下
    2022-03-03
  • linq 查詢 Linq 高級查詢實例代碼

    linq 查詢 Linq 高級查詢實例代碼

    本文針對Linq 高級查詢實例進行詳解,需要了解的朋友可以參考下
    2013-01-01
  • DataSet、DataTable、DataRow區(qū)別詳解

    DataSet、DataTable、DataRow區(qū)別詳解

    這篇文章主要介紹了DataSet、DataTable、DataRow區(qū)別詳解,需要的朋友可以參考下
    2014-02-02

最新評論