Преобразувайте дата от формат 6/05/2020 във формат дд/мм/гггг

Изправен съм пред малък проблем, който не мога, след като опитах толкова много неща, така че ето го ..... Има текстово поле в страницата ми, в което въвеждам дата и искам тази дата в обект за дата и час.

например: дата entd: 6 05 2020 (дд/мм/гггг) трябва да бъде в същия формат, когато имам достъп до него в обект за дата и час, но се променя на (6.05.2020 г.: формат ММ/дд/гггг).

Надявам се, че имам смисъл тук, всичко, което искам, е нещо като това.....

DateTime dt = convert.ToDateTime(txtDate.Text);

dt трябва да бъде (11/2/2010, а не 2/11/2010)

@oded след използване на следния код

DateTime sDate, eDate = new DateTime(); 

//За да промените датите за наша употреба. DateTime.TryParseExact(txtFrom.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out sDate);

DateTime.TryParseExact(txtFrom.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out eDate); 

Това, което получавам в edate и sdate е 6 05 2020 12:00:00 AM, където трябва да е 6/05/2020


person ankur    schedule 06.10.2011    source източник
comment
Не съм сигурен какво имаш предвид. Обект DateTime не трябва да има формат, освен в това, че има имплементация на ToString(). Трябва да можете да го показвате по какъвто желаете начин.   -  person kmkemp    schedule 06.10.2011
comment
Защо не използвате CalenderExtender с негов формат като този CalenderExtender1.Format = "dd.MM.yyy"; от AjaxControlToolkit? Не мисля, че е безопасно да въвеждате датата, която потребителите могат да въведат, ако не знаят как работи вашето текстово поле за дата.   -  person Bastardo    schedule 06.10.2011
comment
Ако получавате 1/1/0001/, това означава, че анализираният текст е невалиден. Просто бих използвал CalenderExtender, защото това, което искате да направите, ще изисква много работа, за да си струва.   -  person Security Hound    schedule 06.10.2011


Отговори (5)


РЕДАКТИРАНЕ: Тази стойност: "11/2/2010" не съответства на формата "дд/мм/гггг". Той съответства на формата "d/M/yyyy" - за "dd/MM/yyyy" трябва да бъде "11/02/2010".

Ето защо TryParseExact се проваля за вас. Трябва да изберете правилния шаблон на формат.


Стойност DateTime няма формат. Той просто представлява дата и час (в ISO календара и вероятно в различни часови зони, но това е друг въпрос). Това е като int - не представлява "десетично цяло число" или "шестнадесетично цяло число" - това е просто цяло число в определен диапазон. Можете да форматирате число като десетично или шестнадесетично, но то по своята същност няма формат.

Изглежда, че трябва да го анализирате с ParseExact, за да посочите формата при конвертиране от текстовото поле, или вероятно TryParseExact:

// This is assuming you're absolutely sure of the format used. This is *not*
// necessarily the user's preferred format. You should think about where your
// data is coming from.
DateTime date;
if (DateTime.TryParseExact(text, "dd/MM/yyyy", CultureInfo.InvariantCulture,
                           DateTimeStyles.None, out date))
{
    // Okay, successful parse. We now have the date. Use it, avoiding formatting
    // it back to a string for as long as possible.
}

Трябва да запазите тази стойност като DateTime за всички цели освен да я върнете на потребител - в този момент може да искате да използвате техните културни настройки.

По-специално, ако съхранявате стойността в база данни, вие не трябва да я преобразувате в текст и да я включвате в SQL израз - това изисква проблеми. Вместо това използвайте параметризиран SQL оператор и го задайте като стойност на параметъра, все още като DateTime.

person Jon Skeet    schedule 06.10.2011
comment
DateTime sDate, eDate = new DateTime(); //За да промените датите за наша употреба. DateTime.TryParseExact(txtFrom.Text, dd/MM/yyyy, CultureInfo.InvariantCulture, DateTimeStyles.None, out sDate); DateTime.TryParseExact(txtFrom.Text, dd/MM/yyyy, CultureInfo.InvariantCulture, DateTimeStyles.None, out eDate); Това, което получавам в edate и sdate, е 1/1/0001 12:00:00 AM, където трябва да бъде 3/11/2011, мисля, че разбрахте мнението ми, изложеното не е правилно, това е само моя грижа. - person ankur; 06.10.2011
comment
@ankur: Вие пренебрегвате върнатата стойност на TryParseExact, която почти сигурно е невярна. Каква е стойността на txtFrom.Text тук? Вие говорите за това, че това е само моя грижа - но ми прави впечатление, че все още фундаментално пропускате точката, че DateTime няма формат. Това, което може да видите в дебъгера, ще бъде форматирано представяне, но това не е същото като стойността вътре в самия DateTime. - person Jon Skeet; 06.10.2011
comment
@ankur: Вижте актуализацията на отговора ми в горната част - ако се опитвате да анализирате 11/2/2010, сякаш месецът е посочен във формат MM (т.е. точно две цифри), тогава това анализът наистина ще се провали. - person Jon Skeet; 06.10.2011
comment
благодаря ви, че посочихте, но проблемът все още е налице, ще обясня и ще поставя примерния код. това, което въведох в sDate = 3/11/2011 и в eDate = 25/6/2002, така че стойностите, които получих, са eDate = 6/25/2002 (грешно) и sDate = 1/1/0001 (грешно). моят код DateTime.TryParseExact(txtFrom.Text, dd/M/yyyy, CultureInfo.InvariantCulture, DateTimeStyles.None, out sDate); DateTime.TryParseExact(txtTo.Text, dd/M/yyyy, CultureInfo.InvariantCulture, DateTimeStyles.None, out eDate); - person ankur; 06.10.2011
comment
@ankur: Не, eDate е DateTime. Това не е 6/25/2002, това е стойност, представляваща 25 юни 2002 г. Не гледайте представянето на програмата за отстраняване на грешки на цялата стойност DateTime, за да се опитате да определите формат на низ. Това те обърква. Използвайте dt.Month и т.н., за да разберете каква е стойността. И 3/11/2011 не отговаря на дд/м/гггг, защото сте дали само една стойност за ден. Звучи, че може да искате d/M/yyyy, както споменах в отговора си. - person Jon Skeet; 06.10.2011

DateTime не съхранява дати в никакъв специфичен формат - използва вътрешно представяне (какво точно не трябва да има значение).

След анализиране на низа до DateTime, там няма присъщ формат. Има само формат, когато извеждате стойността. Това, което виждате в програмата за отстраняване на грешки, е просто преобразуване в низ, използвайки вашите системни настройки.

Ако искате да форматирате DateTime, използвайте ToString с форматиращ низ:

dt.ToString("dd/MM/yyyy");

Обратното също се прилага - ако трябва да анализирате низа недвусмислено, използвайте ParseExact или TryParseExact (и двата статични члена на DateTime):

DateTime dt;

if(DateTime.TryParseExact(txtDate.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture,
                           DateTimeStyles.None, out td))
{
  // Valid date used in `txtDate.Text`, use dt now.
}

Прочетете за персонализирани и стандартни низове за формат на дата и час.

person Oded    schedule 06.10.2011
comment
отново е в низ, тъй като сте използвали ToString, нямам нужда от това, което ми трябва в обекта dattime. можете ли да предоставите някакъв кодов фрагмент за същото, като изберете стойност от текстовото поле и след това отново промените формата му на дд/мм/гггг в обект за дата и час. - person ankur; 06.10.2011
comment
@ankur - A DateTime няма формат. Вие само го форматирате в низ. - person Oded; 06.10.2011
comment
@Oded: Звучи така, сякаш по-важната част тук е синтактичният анализ, а не форматирането. В моята страница има текстово поле, в което въвеждам дата и искам тази дата в обект за дата и час. - това е задача за анализ. - person Jon Skeet; 06.10.2011
comment
Защо не използвате CalenderExtender с негов формат като този CalenderExtender1.Format = "dd.MM.yyy";? - person Bastardo; 06.10.2011
comment
@ankur - Oded е правилен - запазете стойността вътрешно DateTime, където е възможно (никога не я предавайте вътрешно като низ) - това ви спестява много разочарование с часови зони, формати и т.н. Трябва да се притеснявате само за форматирането, когато показвате датата и часа на хората - на екрани, отчети и др. - person StuartLC; 06.10.2011
comment
@Jon - След като прочетох вашия отговор, преработих моя, въпреки че OP има присъщо неразбиране относно връзката между DateTime и форматирането. - person Oded; 06.10.2011
comment
@Oded: Съгласен съм и да се надяваме, че ще стигнем дотам... Ще запазя моя подобен отговор за момента, тъй като всеки може да редактира своя независимо, докато някой щракне за OP. - person Jon Skeet; 06.10.2011
comment
@JonSkeet добър улов.. относно синтактичния анализ. много пъти ми спестява време :) +1 за разбор - person Ravi Gadag; 06.10.2011
comment
@oded това, което получих, след като използвах вашия код, не е това, което търсих. така че тук е моят код DateTime sDate, eDate = new DateTime(); //За да промените датите за наша употреба. DateTime.TryParseExact(txtFrom.Text, dd/MM/yyyy, CultureInfo.InvariantCulture, DateTimeStyles.None, out sDate); DateTime.TryParseExact(txtFrom.Text, dd/MM/yyyy, CultureInfo.InvariantCulture, DateTimeStyles.None, out eDate); Това, което получавам в edate и sdate, е 1/1/0001 12:00:00 AM, където трябва да е 3/11/2011, което въведох - person ankur; 06.10.2011
comment
@ankur - Моля, добавете подробности, като редактирате въпроса и го публикувате там. Коментарите са лошо място за примерни кодове. - person Oded; 06.10.2011
comment
@ankur - Причината TryParseExact да е в if е, че връща false, ако анализът е неуспешен, което изглежда има. Проверете дали низът, който подавате, съответства на формата, който използвате - трябва да е точно същият. - person Oded; 06.10.2011

За да се избегнат грешки в месеци/дни при анализиране на дата, вероятно е по-добре да използвате DateTime.Parse или DateTime.ParseExact отколкото ToDateTime.

Като тази тема и тази статия посочи.

person JMax    schedule 06.10.2011
comment
Проблемът, който потребителят има и не разбира, е, че потребителят може да въведе произволен формат на календара и само форматите, за които той проверява, ще могат да бъдат анализирани. Показването на DateTime след анализиране в специфичен формат е тривиално. - person Security Hound; 06.10.2011

Опитайте DateTime.Parse с подходящ доставчик на формат. В твоя случай трябва да е така

IFormatProvider culture = new CultureInfo("de-DE", true);
DateTime.Parse(txtDate.Text, culture );
person PVitt    schedule 06.10.2011
comment
Това работи само ако входът съответства на предоставената култура. Би се провалил за всеки друг модел - person Security Hound; 06.10.2011
comment
Да това е вярно. Доколкото той поиска даден формат, аз му показах пример как да използва доставчик на формат. Както казах в отговора, той трябва да използва подходящ доставчик на формат. Просто дадох пример... - person PVitt; 06.10.2011

Ако искате да получите достъп до него с определен формат, трябва да използвате DateTime.ToString(формат на низ).

http://msdn.microsoft.com/en-us/library/zdtaw1bw.aspx

person kmkemp    schedule 06.10.2011
comment
Авторът иска да приеме всеки потребителски вход и да преобразува предоставения формат в конкретен формат. Има причина да има контроли на календара за тази цел. Текстово поле само ще му създаде проблем, има твърде много възможни формати за проверка. - person Security Hound; 06.10.2011
comment
Отговорът ми е свързан с това как да изведа DateTime, а не как да го прочета. Въпросът му не изискваше съвет кой контрол да използвам. Доколкото знам, той е принуден да използва текстово поле. - person kmkemp; 06.10.2011