Pytanie Dlaczego funkcja TimeSpan.ToString () wymaga separatorów separujących?


Możesz określić niestandardowy format pliku a DateTime obiekt taki jak ten:

DateTime.Now.ToString("HH:mm:ss");   // 19:55:23

Ale kiedy próbuję użyć tego samego formatu dla TimeSpan obiekt taki jak ten:

DateTime.Now.TimeOfDay.ToString("HH:mm:ss");

Dostaję "Input string was not in a correct format." wyjątek.

Okazuje się, że rozwiązaniem jest to, że musisz uciec ':' znaki takie jak w "HH\\:mm\\:ss". Zauważ, że istnieje podwójny ukośnik odwrotny, ponieważ jeśli podasz tylko jeden, przerwie ciąg, więc musisz również uciec.

Pytanie brzmi, dlaczego deweloperzy .NET Framework zrobili to w ten sposób? Musi być jakiś powód na pewno. Dlaczego nie możemy używać specyfikatorów formatu niestandardowego bez ucieczki od nich, tak jak możemy z DateTime obiekt?

Szukasz guru .NET, aby rzucić światło na ten temat.


11
2018-01-04 17:33


pochodzenie


Ten link MSDN: msdn.microsoft.com/en-us/library/ee372287%28v=vs.110%29.aspx stany The .NET Framework does not define a grammar for separators in time intervals., Nie jestem do końca pewien, co to jest rozumowanie (warto przeczytać mimo to). - Chris


Odpowiedzi:


Jak stwierdzono w dokumentacja, jedna z różnic między DateTime.ToString i TimeSpan.ToString specyfikatory formatu są następujące: niestandardowe specyfikatory formatu TimeSpan nie zawierają symboli separatora symboli zastępczych, takich jak symbole, które oddzielają dni od godzin, godzin od minut lub sekund od ułamków sekund. Zamiast tego te symbole muszą być zawarte w niestandardowym ciągu znaków w postaci literałów łańcuchowych.

W kontrast z TimeSpan (patrz tabela specyfikatorów formatu w dokumentach), DateTime specyfikatory formatu zawierają predefiniowane symbole separatora daty /i dla separatora czasu :. Oznacza to, że na przykład dla włoskiej kultury średnik zostanie uznany jako separator czasu (nie literał) i zostanie zastąpiony przez . symbol:

    // outputs 09.57.18 instead of 09:57:18 because of Italian culture.
    Console.WriteLine(DateTime.Now.ToString("hh:mm:ss", CultureInfo.GetCultureInfo("it-IT")));

Myślę, że projektanci .NET mieli taką różnicę DateTime i TimeSpan string formaterers celowo, i jest cicho rozsądne. Dzieje się tak, ponieważ historycznie Data / Czas zostały sformatowane inaczej dla różnych kultur. Ponadto .NET próbował zapewnić globalizację w tym zakresie DateTime rodzaj. Ale TimeSpan nie dostał takich obowiązków związanych z globalizacją, jest to typ reprezentujący okres czasu, a jego formatowanie nie jest związane z żadną specyfiką kulturową (jeśli kiedykolwiek istniały), ale zamiast tego formatowanie jest stałe w różnych ustawieniach kulturowych.


9
2018-01-04 18:06



Sergey, DateTime.Now.ToString("hh:mm:ss", CultureInfo.GetCultureInfo("it-IT")) nie wyświetla "." zamiast ':'. Czy było jakieś nieporozumienie? - anar khalilov
@Aarar - dla mnie działa świetnie, w twoim przypadku prawdopodobnie oznacza to, że niektóre ustawienia Windows zostały zmienione. Czy dla ciebie działają inne formatery kultur? Na przykład "Ru-ru" powinien zwracać daty sformatowane jak 04.01.2014 - SergeyS
Ma to coś wspólnego z moim środowiskiem: dotnetfiddle.net/2V1HBy - anar khalilov
Czytałem twoją odpowiedź w kółko, aż zrozumiałem prawie wszystko :). Proszę wyjaśnić tę część: "... ale zamiast tego formatowanie (TimeSpan) jest stałe w różnych ustawieniach kultury." Jeśli formatowanie jest stałe, to dlaczego włoski znacznik czasu zawiera .zamiast "stałej" :? Czego nie rozumiem? - anar khalilov
@Aarar - To zdanie jest związane z formatowaniem TimeSpani to formatowanie jest rzeczywiście "stałe" (niezależne od kultury). Mój przykład kultury włoskiej był związany z DateTime, która na odwrót zależy od kultury. Więc nie ma tutaj sprzeczności. - SergeyS