2011-10-24 6 views
7

Moja strona jest hostowana na wielu serwerach w różnych lokalizacjachDateTime problem gdy globalna kultura serwera różni się na różnych serwerach

Wszędzie Kultura formatu danych jest różnych-używamy formatu mm/dd/yyyy wszędzie ale okrywać jakiś serwer ma kulturę ustawioną na dd/mm/yyyy, wtedy nasza strona generuje wyjątek Datetime.

+4

do osoby, którzy głosowali, aby zamknąć ponieważ „trudno powiedzieć co jest proszony jest tutaj”: co jest mylące, prawda? –

Odpowiedz

11

Powinieneś określać, jakiej kultury chcesz użyć, gdy konwertujesz ciąg znaków na datę.

Kultura, której należy używać, zależy od kultury, z której daty są sformatowane.Na przykład, jeśli wszystkie terminy jesteś analizowania są sformatowane jako słowacki:

String s = "24. 10. 2011"; 

Następnie trzeba analizować ciąg jakby to było w Słowackiej (Słowacja) (sk-SK) kultura:

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

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

Jeśli daty są w tadżycki (Tadżykistan cyrylica), to trzeba przeanalizować go jako tg-Cryl-Tj:

String s = "24.10.11" 

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

Co prowadzi do pytania: z jakiego formatu daty korzystasz? Nie powinieneś polegać na ustawieniach regionalnych serwera, powinieneś decydować, jaki format chcesz.

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

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

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

Podejrzewam, że wolisz robić wszystko po angielsku. Ale wtedy trzeba zdecydować, który wariant angielski:

  • en-AU (English Austrailia): 24/10/2011
  • en-IA (angielski Indie): 24-10-2011
  • en-ZA (angielski Republika Południowej Afryki): 2011/10/24
  • en-US (Angielski Stany Zjednoczone): 10/24/2011

Podejrzewam cię preferuj angielski (Indie) (en-IA).


Ale jeśli naprawdę nie może zdecydować, co kultura używać podczas konwersji daty, aby ciągi i vice versa, a terminy nie mają być wyświetlane użytkownikowi, a następnie można użyć Inwariant Kultura:

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 
+0

dzięki za wspaniałe wyjaśnienie – Murtaza

+1

Nigdy nie powinieneś używać żadnych ustawień kultury z domeny lub os. Jeśli ktoś nadpisze je z jakiegokolwiek powodu (jak inna aplikacja nie działa poprawnie) twoja aplikacja przestaje działać. Jeśli format jest zawsze taki sam, powinieneś użyć tryparseexact lub parseexact. – Peter

+0

Do tego wszystkiego, na Windows 10 jest domyślnie nowy format daty nowo bez spacji. – Fanda

0

Nigdy polegać na domyślnych ustawieniach regionalnych serwera. W Twoim przypadku, to znaczy:

  • Zastosowanie przygotowane sprawozdanie, w którym przekroczyły datę jako (sformatowana) data obiektu, a nie (sformatowany) obiektu String. Nigdy nie powinieneś używać łańcuchów do reprezentowania dat w aplikacji, ponieważ nie możesz wykonywać na nich żadnych funkcji związanych z datami (np. Dodawanie 1 miesiąca, otrzymywanie ostatniego dnia bieżącego tygodnia itp.)

  • Użyj funkcji SQL, takich jak to_date i to_char wszędzie (dokładne nazwy zależą od DBMS), jeśli naprawdę trzeba użyć obiektów ciąg w aplikacji

+0

proste i zrozumiałe rozwiązanie dziękuje, ale Ian Boyd wyjaśnił, dlaczego powinniśmy pracować nad tym analizowaniem. Dziękuję wam obu. – Murtaza

1

Nigdy, nigdy, dat sklepowych wewnętrznie jako ciągi. Nie w bazie danych, nie w aplikacji.

Jeśli chcesz przenieść wartości daty między serwerami, przejdź do trybu binarnego. Lub jeśli naprawdę musisz używać ciągów, użyj ToString(CultureInfo.InvariantCulture) - lub po prostu serializuj właściwość Ticks.

Ponadto, nigdy nie przekazuj dat jako ciągów do bazy danych za pomocą poleceń SQL budowanych przy użyciu kodu. Użyj tego, lub nawet lepiej, polegaj na niektórych programach odwzorowujących O/R, takich jak Entity Framework lub Linq na SQL.

0

Jeśli zostanie wdrożony na serwerze, który nie jest pod Twoją kontrolą, bardzo ważne jest, aby upewnić się, że kod nie ma zakodowanych zależności od kultury.

Najprawdopodobniej będziesz chciał przeszukać kod w programie DateTime.Parse lub podobnym. Mamy zestaw metod rozszerzających na DateTime, których używamy zamiast wymuszać poprawną kulturę.

Powiązane problemy