2009-09-30 76 views
0

我們剛搬到新的服務器上,一切進展順利。不過,在我嘗試將格式爲「dd/mm/yyyy」的字符串轉換爲日期時,我遇到了.NET錯誤,現在我更改了本地web.config中的文化設置,但我們要求這是全局的。新服務器上的.NET全球文化

我該在哪裏更改?我假定machine.config,但在舊服務器上找不到任何熟悉的設置。

或者我應該在服務器端查找設置,將機器上的文化設置爲en-GB?

==更新== 我已經更改了區域設置,但仍然失敗。是否有一個machine.config全局設置,可能會搞砸了?目前它似乎在使用不變和失敗。

我使用Windows Server 2008與IIS7,如果這是任何幫助。

正在使用的字符串被硬編碼到頁面中,因爲它是關閉註冊表單的關閉日期。

的代碼是跑如下:

if (DateTime.Now > Convert.ToDateTime("26/04/2008 12:00")) 

很簡單,現在已經工作過一百萬次,這是隻在出現此錯誤這個新的設置。

+0

您是否已將地區設置更改爲en-GB或en-US? – 2009-09-30 14:36:56

+0

區域和語言選項控制面板中的所有內容都已設置爲英國。 – 2009-09-30 14:47:50

+0

你從哪裏得到這個日期?它是否保存在磁盤或其他地方?它是否在相同的進程或線程中生成?它是由另一個程序產生的嗎?請給我們更多關於應用場景的信息。 – 2009-09-30 15:13:12

回答

1

到底(我不知道這是否是做的最好的辦法還是沒有),我不得不選擇計算機從IIS7內部並將全球化設置設置爲en-GB。這確實解決了這個問題,並將在未來的所有其他網站保留在該文化中,除非另有說明。

請注意,我已經將計算機區域設置更改爲英國,但尚未解決問題。

然而,我將從現在開始與阿爾弗雷德的指定文化解析日期的建議。

+0

這條線路適用於我,更改了機器的語言環境,需要重新啓動。 – CountZero 2009-10-08 14:30:09

+0

我也這麼做了,我確定我錯過了一些我根本找不到的東西。 – 2009-10-08 21:29:18

2

遷移服務器時,我建議您使用與以前相同的區域設置(控制面板) - 如果可以的話。只要這樣做,就可以避免很多問題。

這可能是不可能的,但是如果新服務器將要託管其他區域設置的應用程序,或者由於新策略而必須應對。

在任何情況下,在所有Parse和ToString()調用期間明確指定適用的格式是最佳實踐。

甚至有一個FxCop(和靜態分析)規則。


更新,以反映問題的新的信息:它調用DateTime.Parse傳球


public static DateTime ToDateTime(string value) 
{ 
    if (value == null) 
    { 
     return new DateTime(0L); 
    } 
    return DateTime.Parse(value, CultureInfo.CurrentCulture); 
} 

注:

Convert.ToDateTime是一個 「方便」 的方法,只要實施一個明確的CultureInfo(CultureInfo.CurrentCulture)。

CultureInfo.CurrentCulture從Thread.CurrentThread.CurrentCulture中獲取它的值。

您可以在CultureInfo.CurrentCulture看一看,看看有什麼的CultureInfo它實際上是返回和/或進一步調查,試圖瞭解發生了什麼,但另一方面,則建議您明確指定的在將字符串解析爲其他數據類型(如DateTime,Double等)時使用的格式化程序。

正如我在我的原始答案中所說的那樣,有一個FxCop(靜態分析)規則來檢查是否缺少IFormatProvider傳遞給有重載接收實例的方法:CA1305

因此,我建議你重寫代碼的東西沿着線:


if (DateTime.Now > DateTime.Parse("26/04/2008 12:00", new CultureInfo("en-GB"))) 
+0

我已經更改了區域設置,但仍然不幸失敗。 是否有一個machine.config的全局設置,可能會搞砸了?目前它似乎在使用不變量。 – 2009-09-30 14:16:31

+0

我很欣賞這些額外的信息,我將會明確地將其納入未來。然而,它實際上並沒有解決我的問題,因爲我有大約30個需要更新的網站,而不是時間去做。 – 2009-10-01 14:35:33

+0

我投票贊成好的答案。 – 2009-10-01 14:36:09

0

您應該指定將字符串轉換爲日期時要使用的文化。

您應該使用的文化取決於日期被格式化爲何種文化。例如,如果您解析所有日期格式爲斯洛伐克

String s = "24. 10. 2011"; 

然後,你需要分析字符串,就好像是在斯洛伐克(斯洛伐克)sk-SK)文化:

//Bad: 
d = DateTime.Parse(s); 

//Good: 
d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("sk-SK")); //Slovak (Slovakia) 

如果您的日期都在塔吉克斯坦(塔吉克斯坦西里爾文),那麼你需要分析它作爲tg-Cryl-Tj

String s = "24.10.11" 

DateTime d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("tg-Cryl-Tj")); 

這導致了一個問題:你使用什麼日期格式?你不應該依賴服務器的區域設置,你應該決定你想要的格式。

//Bad 
String s = d.ToString(); 

//Good 
String s = d.ToString(CultureInfo.CreateSpecificCulture("si-LK")); //Sinhala (Sri Lanka) 

//s = "2011-10-24 12:00:00 පෙ.ව." 

我懷疑你更喜歡用英語來做所有事情。但你必須決定英語是哪個變種:

  • en-IA(英文印度):24-10-2011 15:19:52
  • en-BZ(英文伯利茲):24/10/2011 03:19:52 PM
  • en-AU(英文Austrailia):24/10/2011 3:19:52 PM
  • en-NZ(英文新西蘭):24/10/2011 3:19:52 p.m.
  • en-GB(英國英國):24/10/2011 15:19:52
  • en-ZA(英文南非):2011/10/24 03:19:52 PM
  • en-US(英語美國):10/24/2011 3:19:52 PM

但如果你真的不能決定轉換日期字符串和副時使用何種文化反之亦然,以及日期都從未想過要顯示給用戶,那麼你可以使用不變文化

String s = "10/24/2011" //invariant culture formatted date 

d = DateTime.Parse(s, CultureInfo.InvariantCulture); //parse invariant culture date 

s = d.ToString(CultureInfo.InvariantCulture); //convert to invariant culture string