Возникли проблемы с AM / PM с DateTimeOffset.TryParseExact - PullRequest
0 голосов
/ 23 октября 2018

У меня есть код, который я хочу проверить на правильное время, и по какой-то причине он работает для дат с PM, но не с AM.

Так что я беру в форматах, которые соответствуют этому формату:

6/1/2018 12:00:00 PM

Однако по тем или иным причинам это работает отлично, когда у него PM, но когда я заменяю его на AM, он ломается.Формат в приемлемых форматах, по которым я принимаю его, имеет следующий формат:

М / д / гггг ЧЧ: мм: сс тт

Ниже приведен сбой, говорящий, что это ложь:

      DateTimeOffset dateTimeResult;
        var acceptableFormats = new string[] {
                            "yyyy-MM-dd'T'HH:mm:ss.FFFK",
                            "M/d/yyyy HH:mm:ss",
                            "MM/dd/yyyy HH:mm:ss",
                            "M/d/yyyy HH:mm:ss tt",
                            "MM/dd/yyyy HH:mm:ss tt",
                            "yyyy-MM-dd' 'HH:mm:ss.FFFK",
                            "yyyy-MM-dd'T'HH:mm:ssK",
                            "yyyy-MM-dd' 'HH:mm:ssK",
                            "yyyy-MM-dd'T'HH:mm:ss",
                            "yyyy-MM-dd' 'HH:mm:ss",
                            "yyyy-MM-dd'T'HH:mm",
                            "yyyy-MM-dd' 'HH:mm",
                            "yyyy-MM-dd'T'HH",
                            "yyyy-MM-dd' 'HH",
                            "yyyy-MM-dd",
                            "yyyy-MM-dd",
                            "yyyyMMdd",
                            "MM/dd/yyyy",
                            "M/d/yyyy",
                            "yyyy-MM",
                            "yyyy" };
        DateTimeOffset dateTimeResult;
        var timeOffset = DateTimeOffset.TryParseExact("6/1/2018 12:00:00 AM", acceptableFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTimeResult);

Эта работа говорит, что это правда:

      DateTimeOffset dateTimeResult;
        var acceptableFormats = new string[] {
                            "yyyy-MM-dd'T'HH:mm:ss.FFFK",
                            "M/d/yyyy HH:mm:ss",
                            "MM/dd/yyyy HH:mm:ss",
                            "M/d/yyyy HH:mm:ss tt",
                            "MM/dd/yyyy HH:mm:ss tt",
                            "yyyy-MM-dd' 'HH:mm:ss.FFFK",
                            "yyyy-MM-dd'T'HH:mm:ssK",
                            "yyyy-MM-dd' 'HH:mm:ssK",
                            "yyyy-MM-dd'T'HH:mm:ss",
                            "yyyy-MM-dd' 'HH:mm:ss",
                            "yyyy-MM-dd'T'HH:mm",
                            "yyyy-MM-dd' 'HH:mm",
                            "yyyy-MM-dd'T'HH",
                            "yyyy-MM-dd' 'HH",
                            "yyyy-MM-dd",
                            "yyyy-MM-dd",
                            "yyyyMMdd",
                            "MM/dd/yyyy",
                            "M/d/yyyy",
                            "yyyy-MM",
                            "yyyy" };
        DateTimeOffset dateTimeResult;
        var timeOffset = DateTimeOffset.TryParseExact("6/1/2018 12:00:00 PM", acceptableFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTimeResult);

1 Ответ

0 голосов
/ 23 октября 2018

Причина, по которой у вас возникла эта проблема, заключается в том, что ваш формат запрашивает 24-часовой компонент.12, через 24 часа ВСЕГДА означает «полдень».Вы не можете иметь «полдень AM», потому что AM только для времени между полуночью и полуднем (эксклюзив) .

Эта строка вызывает исключение из-за неверного формата ввода:

DateTimeOffset.ParseExact("6/1/2018 12:00:00 AM", "M/d/yyyy HH:mm:ss tt", 
    CultureInfo.InvariantCulture)

Если я изменю HH на hh, то это будет работать:

DateTimeOffset.ParseExact("6/1/2018 12:00:00 AM", "M/d/yyyy hh:mm:ss tt", 
    CultureInfo.InvariantCulture)

// returns a valid DateTimeOffset object, which in
// my culture is displayed as '6/1/2018 12:00:00 AM -04:00'
// (I happen to be in -4 UTC)
...