2008-11-25 14 views
16

Nie wiesz, co się tutaj dzieje.String.Format (format, data) ignoruje format

Mam obiektu DateTime, a gdy próbuję:

String.Format("{0:dd/MM/yyyy}", _date) 

wartość zwracana jest:

"24-05-1967" 

Co chcę jest

"24/05/1967" 

Może ktoś wyjaśnić, dlaczego mój ciąg znaków jest ignorowany?

Nieco więcej tła: To jest aplikacja internetowa, która zaczęła życie jako .net 1.1, a ja jestem w trakcie przenoszenia jej do wersji 2.0/3.5.

Aktualizacja:

Jeśli zmienić format na {0: DD: MM: RRRR}, zwraca 24: 05: 1967 - to tylko/w ciągu formatu, który zostanie zmieniony na - char.


Rozdzielczość:

Podczas aktualizacji aplikacji do uruchomienia pod 2.0, ustawienia globalizacyjne asp.net zostały pomieszane.

Z właściwości strony internetowej, karty ASP.NET, konfiguracji edycji, zakładki aplikacji - kultura i kultura interfejsu użytkownika zostały ustawione na pierwszą pozycję na liście (af-ZA) z jakiegoś dziwnego powodu.

Odpowiedz

24

Przycisk/jest separatorem daty dla konkretnej kultury, który może być - innymi słowy, ciąg formatu nie jest ignorowany, ale właściwie używany . Spójrz na to, co jest związane z CultureInfo wątku biegu:

System.Threading.Thread.CurrentThread.CurrentCulture 

Jeśli spróbujesz to:

String.Format(new CultureInfo("en-US"), "{0:dd/MM/yyyy}", DateTime.Now); 

Dostaniesz datę sformatowany/ponieważ jest to poprawny separator do en-US. Co prawdopodobnie należy zrobić, to użyć format ciągu krótkiego datę i upewnij się, że gwint ma odpowiednią kulturę związaną, to byłoby to dostać to, co chcesz i to będzie działać w zglobalizowanym aplikacji, a także:

DateTime.Now.ToString("d", Thread.CurrentThread.CurrentCulture); 

Mam nadzieję że to pomoże!

+0

+1 za zapamiętanie, że "/" jest konwertowane dla kultury ORAZ wskazanie, że specyfikator "d" skrótu daty może być lepszy :) – Nij

9

Najprawdopodobniej użyjesz metody ToString() obiektu DateTime, aby uzyskać reprezentację napisów, której szukasz. Ciąg formatu "dd"/"MM"/"rrrr" podaje format, który opisałeś. Zwróć uwagę, że musisz uciec od znaków literowych w ciągu znaków w formacie pojedynczym cudzysłowem.

Przykład: DateTime.Now.ToString("dd'/'MM'/'yyyy");

+0

Dzięki, że działa - nie sądzę, że wiesz, kiedy to się zmieniło (między 1,1 a 3,5), a tam gdzie jest to udokumentowane? – chris

+0

Zobacz .NET Framework 3.5: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx (.NET 3.5) i .NET Framework 1.1: http://msdn.microsoft.com/en-us /library/8kb3ddd4(VS.71).aspx (.NET 1.1) po szczegóły. Wygląda na to, że interfejs API nie został zmieniony dla niestandardowych ciągów w formacie DateTime. – Oppositional

0

To dziwne. To formatowanie działa poprawnie dla mnie. Zamiast tego możesz spróbować _date.ToString ("dd/MM/rrrr") (choć to tylko ujęcie w ciemności).

0

Ustawienia regionalne (na serwerze WWW?) Mają ograniczniki daty ustawione na "-". W moim locale (EE) wyjście będzie "24.05.1967" :)

1

Dopóki nie określisz IFormatProvider (zazwyczaj obiekt CultureInfo), domyślnie użyje formatowania daty/czasu Thread.CurrentThread.CurrentCulture, które da ci zmieniające się wyniki.

I tak, zmieni się/ale nie:.

Rozwiązaniem w tym przypadku jest określenie dostawcy formatu, tak:

String.Format(CultureInfo.InvariantCulture, "{0:dd/MM/yyyy}", _date) 
1

Znak „/” jest kultura neutralny symbol zastępczy separatora charakterze czasowym data który jest zdefiniowany w ustawieniach regionalnych. Tak więc jest to znak ":" na czas.

Aby osadzić znak "/" dosłownie, a nie jako symbol zastępczy, należy umieścić go w cudzysłowie "/" w ciągu znaków formatowania.

0

To daje swoją wymagane wyjście

String.Format("{0:dd/MM/yyyy}", Convert.ToDateTime(_date)); 
0

Ciekawe wątek!

Mam aplikację, która czyta w pliku Excel, i pozwala użytkownikowi eksportować dane do pliku .csv w formacie zdefiniowanym przez użytkownika .

Szczególnie chciałem umożliwić użytkownikom eksportowanie dat do (dokładnie) formatu rrrr/mm/dd, niezależnie od informacji o ich kulturze laptopa.

Próbowałem kilka z tych sugestii, ale jedynym, który nie działa była sugestia Pop Catalin jest, aby owinąć każdy/znaków z apostrofami:

outputFormat = outputFormat.Replace("/", "'/'"); 
valueToExport = ImportedDate.ToString(outputFormat); 

To wydaje się być tylko sposób zmusić ToString(), aby użyć dokładnego ciągu formatów, nie próbując nic robić.

Aktualizacja

zawsze znajdę to zabawne, kiedy odpowiedzieć na pytanie StackOverflow, a następnie uderzył w sam błąd kilka lat później, a natknąć własnego odpowiedź!

Jak wspomniano w wielu z tych odpowiedzi, rozwiązaniem jest zawijanie znaków ukośnika do przodu w apostrofach, aby zmusić użytkownika ToString() do zignorowania ustawień kultury.

Tak więc, jeśli twoje ustawienia Kultury mają znak pełnometrażowy jako znak separatora daty (np. "20.07.2015"), to oto, co zobaczysz, próbując ładnie sformatować datę Bożego Narodzenia i jak można łatwo zmusić go do zawsze ruchu naprzód-ukośniki:

DateTime dtChristmas = new DateTime(2015, 12, 31); 

// This might return "31/12/2015", "31.12.2015", etc, depending on Culture settings 
string str1 = dtChristmas.ToString("dd/MM/yyyy"); 

// ...but these two statements will both *always* return "31/12/2015" 
string str2 = dtChristmas.ToString("dd'/'MM'/'yyyy"); 
string str3 = dtChristmas.ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);