DateTimeFormat Issue - PullRequest
       1

DateTimeFormat Issue

1 голос
/ 15 сентября 2010

Я не получаю желаемый вывод из DateTime-Object:

2010-03-29 13: 15: 00

Моя локализация по умолчанию - de-DE, поэтому простая ToString дает мне:

29.03.2010 13: 15: 00

Я пытался создать объект DateTimeFormatInfo из US-Culture и использовать его DateTimePatterns, но безуспешно:

Dim usDateFormat As Globalization.DateTimeFormatInfo = New Globalization.CultureInfo("en-US", False).DateTimeFormat
usDateFormat.DateSeparator = "-"
ruleResult.Claim.Last_Updated_Date.ToString(usDateFormat.ShortDatePattern)

Вывод: 3.29.2010

Каков наилучший способ (удобочитаемый, быстрый) для получения желаемого DateTimeFormat (иногда мне нужна короткая Дата, а иногда дата и время, как в моем примере выше)?

Благодарю вас в ожидании, Тим

EDIT : почему мой подход DateTimeFormatInfo не работает и делает разницу в производительности при использовании решений String.Format или ToString ("гггг-ММ-дд ЧЧ: мм: сс") вместо частный общий (статический) DateTimeFormatInfo-Object? Я вызываю эту функцию по крайней мере 30 000 раз, и внутри нее много форматируемых дат.

Ответы [ 7 ]

11 голосов
/ 15 сентября 2010

Я думаю, что вы ищете:

DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

Вот несколько примеров, я думаю, что если вы посмотрите, то вы сможете понять, как это работает:

// create date time 2008-03-09 16:05:07.123
DateTime dateTime = new DateTime(2008, 3, 9, 16, 5, 7, 123);

dateTime.ToString("y yy yyy yyyy");  // "8 08 008 2008"   year
dateTime.ToString("M MM MMM MMMM");  // "3 03 Mar March"  month
dateTime.ToString("d dd ddd dddd");  // "9 09 Sun Sunday" day
dateTime.ToString("h hh H HH"    );  // "4 04 16 16"      hour 12/24
dateTime.ToString("m mm"         );  // "5 05"            minute
dateTime.ToString("s ss"         );  // "7 07"            second
dateTime.ToString("f ff fff ffff");  // "1 12 123 1230"   sec.fraction
dateTime.ToString("F FF FFF FFFF");  // "1 12 123 123"    without zeroes
dateTime.ToString("t tt"         );  // "P PM"            A.M. or P.M.
dateTime.ToString("z zz zzz"     );  // "-6 -06 -06:00"   time zone
4 голосов
/ 15 сентября 2010

Чтобы получить 2010-03-29 13:15:00 Я бы просто использовал пользовательский шаблон.В этом случае:

DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");

См. эту статью MSDN для получения дополнительной информации

2 голосов
/ 15 сентября 2010

Как насчет этого решения:

// Get a default DateTimeFormat
var dateTimeFormat = CultureInfo.GetCultureInfo("en-US").DateTimeFormat;
// Clone it to make it writeable
dateTimeFormat = (DateTimeFormatInfo)dateTimeFormat.Clone();
// Change the DateSeparator
dateTimeFormat.DateSeparator = "-";
// Output it as normal
var output = DateTime.Now.ToString("g", dateTimeFormat);

Я думаю, что большинство людей не знают, что вы можете получить доступную для записи версию культуры, создав новый объект, вызвав метод Clone().

Обновление

Как сказал Тим, вы также можете назвать это так:

// Get a default DateTimeFormat
var dateTimeFormat = new CultureInfo("en-US").DateTimeFormat;
// Change the DateSeparator
dateTimeFormat.DateSeparator = "-";
// Output it as normal
var output = DateTime.Now.ToString("g", dateTimeFormat);

Это работает, потому что мы создали новый CultureInfo, полученный из данной культуры. Причина, по которой первый доступен только для чтения, заключается в том, что в первом случае мы получим ссылку на какой-то статически созданный экземпляр где-то в глубине фреймворка и с помощью вызова Clone() мы создадим новый класс с такими же настройками. Во втором подходе мы создаем непосредственно новый класс, но говорим, что хотели бы получить все настройки из определенной культуры.

Итак, в конце концов, обе версии делают то же самое, что описано другими словами. Если есть разница в производительности между двумя версиями, я не могу сказать, но я думаю, что этим можно пренебречь.

Обновление 2

Прочитав последний комментарий Томса, он пытается что-то вроде этого:

// Get a default DateTimeFormat
var dateTimeFormat = new CultureInfo("en-US").DateTimeFormat;
// Change the DateSeparator
dateTimeFormat.DateSeparator = "-";
// Output it as normal
var output = DateTime.Now.ToString(dateTimeFormat.ShortDatePattern);

Что приводит к неправильному выводу. Это происходит потому, что внутри dateTimeFormat.ShortDatePattern есть обычная строка, содержащая M/d/yyyy. То же самое, что звонить DateTime.Now.ToString("M/d/yyyy").

В связи с тем, что / будет заменен DateSeparator, и в настоящее время нет IFormatProvider, он принимает текущую культуру, которая в вашем случае является немецкой. Поэтому, чтобы решить эту проблему, вы должны попробовать следующий код:

// Get a default DateTimeFormat
var dateTimeFormat = new CultureInfo("en-US").DateTimeFormat;
// Change the DateSeparator
dateTimeFormat.DateSeparator = "-";
// Output it as normal
var output = DateTime.Now.ToString(dateTimeFormat.ShortDatePattern, dateTimeFormat);

И с помощью этой информации вы также сможете сделать некоторые предположения о том, что быстрее:

var output = DateTime.Now.ToString(dateTimeFormat.ShortDatePattern, dateTimeFormat);
var output = DateTime.Now.ToString("M/d/yyyy", dateTimeFormat);

Из-за того, что они точно такие же, не должно быть разницы в производительности

1 голос
/ 15 сентября 2010

Вы можете использовать опцию форматирования в ToString DateTime следующим образом:

long

DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

short

DateTime.Now.ToString("yyyy-MM-dd");
1 голос
/ 15 сентября 2010
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")

DateTime.Now.ToString("yyyy-MM-dd")
0 голосов
/ 30 сентября 2010

Вы также можете попробовать format(date.now,"yyyy-MM-dd HH:mm:ss)

0 голосов
/ 15 сентября 2010
string.Format("{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now)

для предопределенного шаблона, проверьте это: http://alexonasp.net/samples/stringformatting/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...