При синтаксическом анализе datetime выдается ошибка, когда слово начинается с индекса 3 - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть дата и время в строковом формате, который выглядит следующим образом:

24-ago-19 19:21:14

Или форматируется так:

Aug-24-19 19:21:14 

Когда я использую это во втором формате:

DateTime.Parse(dateTime); 

Правильно анализирует дату и время - однако в первом формате:

24-ago-19 20:21:14 

Я получаю сообщение об ошибке, подобное этому:

Строка не была распознана как допустимый DateTime,Есть неизвестное слово, начинающееся с индекса 3

Как я могу обработать преобразование любого формата даты - и предпочтительно преобразовать его в "Тихоокеанское стандартное время"?

Что я делаю неправильноВот ? Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 09 ноября 2019

Вы не можете проанализировать ago и Aug с одинаковыми CultureInfo без любых манипуляций со строкой в ​​вашем пользовательском формате строки.

Давайте сначала запустим некоторый код;

foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
    if (culture.DateTimeFormat.MonthNames.Contains("ago") ||
        culture.DateTimeFormat.AbbreviatedMonthNames.Contains("ago"))
    {
       if (culture.DateTimeFormat.MonthNames.Contains("Aug") ||
           culture.DateTimeFormat.AbbreviatedMonthNames.Contains("Aug"))
       {
           Console.WriteLine(culture.Name);
       }
    }
}

Этот код не записывает никакого имени CultureInfo на моем компьютере и, вероятно, не будет печататься на вашем. Это означает, что нет информации о культуре, которая включала бы оба названия месяца и сокращенное название месяца. Даже я проверяю названия родительного месяца (который включает в себя свойства AbbreviatedMonthGenitiveNames и MonthGenitiveNames), но не повезло.

Если вы можете разобрать Aug-24-19 19:21:14 stringс DateTime.Parse напрямую, это означает, что ваш CurrentCulture имеет Aug в качестве сокращенного названия месяца и MMM-dd-yy HH:mm:ss в качестве стандартного формата даты и времени.

Как можноЯ занимаюсь преобразованием любого формата даты

Вы не можете. Вы должны точно знать, какой формат вашей строки, чтобы предотвратить неоднозначные ситуации. Например, давайте возьмем 01-02-2019 строку. Это 2 января или 1 февраля? Можете ли вы сказать это, посмотрев только его формат? Разные люди в разных регионах мира читают этот формат по-разному.

и предпочтительно преобразовать его в "стандартное тихоокеанское время"

После успешного анализа строки (помните, что DateTime.Kind должно быть Local), вы можете использоватьTimeZoneInfo.ConvertTimeBySystemTimeZoneId метод, чтобы преобразовать это как;

var myDate = DateTime.Parse("Aug-24-19 19:21:14 "); 
var myPSTdate = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(myDate , "Pacific Standard Time");

Что я здесь не так делаю?

Насколько я вижу,Вы не делаете ничего плохого. Ваши входные данные не являются надежными для анализа с той же культурной информацией. Вот и все. Некоторые люди называют эту ситуацию мусором, мусором . Если вы можете исправить свои входные данные, вы должны сначала исправить их формат.

...