ParseExact не может проанализировать строку в формате RFC 3339 Internet Date / Time - PullRequest
2 голосов
/ 22 октября 2019

Кажется, что C # не удается проанализировать время в допустимом формате RFC 3339:

DateTime.ParseExact("2019-12-31T00:00:00.123456789+01:00", "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffffzzz", null)

Эта строка вызывает исключение, в то время как эта строка работает просто отлично:

DateTime.ParseExact("2019-12-31T00:00:00.1234567+01:00", "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz", null)

Так что кажется, что есть ограничение на миллисекунды, но я не могу найти какую-либо документацию по этому вопросу. Это так и должно быть?


Причина, по которой я хочу разобрать эту дату, заключается в том, что у меня есть поле ввода даты. Мы используем формат OAS (Swagger) date-time, который довольно четко говорит о том, что любая дата в формате RFC 3339 Internet Date / Time должна быть действительной. Теперь из спецификации здесь раздела 5.6

time-secfrac    = "." 1*DIGIT

Насколько я понимаю, это означает, что должно быть разрешено до 9 цифр и чтобы они были совместимы на 100%, мы должны разрешить эти входы,но, похоже, C # даже не поддерживает это.

Есть идеи, как это исправить?

Ответы [ 3 ]

2 голосов
/ 22 октября 2019

Per MSDN спецификация, вы можете использовать только fffffff

Спецификатор пользовательского формата "fffffff" представляет семь старших цифр доли секунды;то есть он представляет десять миллионов долей секунды в значении даты и времени.

В вашем первом примере

DateTime.ParseExact("2019-12-31T00:00:00.123456789+01:00", "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffffzzz", null)

вы используете fffffffff, что является более точнымдля пользовательских форматов даты и времени .NET

1 голос
/ 22 октября 2019

Насколько я знаю, .NET поддерживает семь наиболее значимых цифр для миллисекунд, которые равны Спецификатор пользовательского формата "fffffff" предназначен для.

Пользовательский "fffffff"спецификатор формата представляет семь наиболее значимых цифр доли секунды;то есть он представляет десятые миллионные доли секунды в значении даты и времени.

Несмотря на то, что можно отобразить десятые миллионные доли второго компонента временного значения, это значение может не иметь значения. Точность значений даты и времени зависит от разрешения системных часов.

Это означает, что вы предоставляете , а не значимые данные, которые не поддерживаются для .NET Framework. Я настоятельно рекомендую не делать этого.

0 голосов
/ 22 октября 2019

В дополнение к информации в других ответах, если вы не можете изменить свой ввод и по-прежнему хотите его проанализировать, вы можете использовать одно из следующих решений:

  1. Если вашвходные данные всегда будут в одном и том же формате (т. е. имеют дробные цифры 9 секунд), вы можете просто удалить два лишних и продолжить его разбор:

    string input = "2019-12-31T00:00:00.123456789+01:00";
    input = input.Remove(27, 2);
    // TODO: parse `input`.
    
  2. Если вызаранее не знаете количество цифр в долях секунды, вы можете использовать что-то вроде этого:

    string input = "2019-12-31T00:00:00.123456789+01:00";
    string format = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFFzzz";
    
    var regEx = new Regex(@"^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{1,7})\d*");
    input = regEx.Replace(input, "$1");
    DateTime parsedDate = DateTime.ParseExact(input, format, null);
    
...