Próbuję przekonwertować wartość w formacie ciągu na typ daty z formatem dd/MM/yyyy
.
this.Text="22/11/2009";
DateTime date = DateTime.Parse(this.Text);
Jaki jest problem ? Ma drugie nadpisanie, o które prosi IFormatProvider
. Co to jest? Czy muszę to również przekazać? Jeśli tak, jak go używać w tym przypadku?
Edytować
Jakie są różnice między Parse
i ParseExact
?
Edytuj 2
Obie odpowiedzi Slaksa i Sama pracują dla mnie, obecnie użytkownik podaje dane wejściowe, ale upewnię się, że są one prawidłowe za pomocą maskTextbox.
Która odpowiedź jest lepsza, biorąc pod uwagę wszystkie aspekty, takie jak bezpieczeństwo pisania, wydajność lub coś, na co masz ochotę
Odpowiedzi:
Użyj
DateTime.ParseExact
.źródło
dd/MM/yyyy
więc ciągiem tekstowym zawierającym godzinę, który nie zostanie poprawnie przeanalizowany. Musisz albo usunąć czas, albo uwzględnić go we wzorcu formatu. Istnieje przeciążenie,ParseExact
które akceptuje tablicę wzorców formatu i analizuje tekst, jeśli pasuje do któregokolwiek z nich.CultureInfo.InvariantCulture
zamiast obecnego, jeśli mimo wszystko definiujesz format?Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");
, to zepsuje twoje rozwiązanie. Aby to naprawić, użyj"dd'/'MM'/'yyyy"
(chroniąc ukośniki pojedynczymi cudzysłowami) lub@"dd\/MM\/yyyy"
(„uciekając” przed ukośnikiem odwrotnym ukośnikiem).Musisz zadzwonić
ParseExact
, co analizuje datę, która dokładnie pasuje do podanego formatu.Na przykład:
IFormatProvider
Parametr określa kulturę używać do analizowania datę.O ile twój ciąg nie pochodzi od użytkownika, powinieneś przejść
CultureInfo.InvariantCulture
.Jeśli ciąg pochodzi od użytkownika, należy przekazać
CultureInfo.CurrentCulture
, który użyje ustawień określonych przez użytkownika w Opcjach regionalnych w Panelu sterowania.źródło
using System.Globalization;
Analiza ciągu reprezentującego DateTime jest trudna, ponieważ różne kultury mają różne formaty dat. .Net jest świadomy tych formatów dat i pobiera je z bieżącej kultury (
System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat
), gdy wywołujeszDateTime.Parse(this.Text)
;Na przykład ciąg „22/11/2009” nie pasuje do ShortDatePattern dla Stanów Zjednoczonych (en-US), ale jest zgodny z Francją (fr-FR).
Teraz możesz wywołać
DateTime.ParseExact
i przekazać dokładny ciąg formatu, którego oczekujesz, lub możesz przekazać odpowiednią kulturę,DateTime.Parse
aby przeanalizować datę.Na przykład, to poprawnie przeanalizuje twoją datę:
Oczywiście nie powinieneś losowo wybierać Francji, ale coś odpowiedniego dla swoich potrzeb.
Musisz dowiedzieć się, co
System.Threading.Thread.CurrentThread.CurrentCulture
jest ustawione i czy / dlaczego różni się od tego, czego oczekujesz.źródło
Chociaż powyższe rozwiązania są skuteczne, możesz również zmodyfikować plik webconfig za pomocą następującego ...
Ref: Format daty i godziny różni się na maszynie lokalnej w porównaniu z maszyną produkcyjną
źródło
Może być konieczne określenie kultury dla tego konkretnego formatu daty, jak w:
Więcej informacji można znaleźć tutaj:
http://msdn.microsoft.com/en-us/library/5hh873ya.aspx
źródło
Po spędzeniu dużej ilości czasu rozwiązałem problem
źródło
użyj tego, aby przekonwertować ciąg na datetime:
źródło
W oparciu o to odniesienie zadziałało następne podejście:
źródło
źródło
Tak jak ktoś powyżej powiedział, że możesz wysłać go jako parametr ciągu, ale musi on mieć następujący format: na przykład '20130121' i możesz go przekonwertować na ten format, pobierając go bezpośrednio z kontrolki. Więc otrzymasz go na przykład z pola tekstowego, takiego jak:
aby przekonwertować go na: '20130121', użyjesz:
aby SQL mógł go przekonwertować i umieścić w bazie danych.
źródło
Możesz również użyć
źródło
Pracował dla mnie poniższy kod:
Przestrzeń nazw
źródło
Zmień ręcznie:
Od 22.11.2015 zostanie przekonwertowany 22.11.2015
źródło