Из ISO-8601: 2004 (E) Спецификация:
4.2.2.4 Представления с десятичной дроби
При необходимости для конкретного приложения десятичная доля часа, минуты или секунды могут быть включены. Если включена десятичная дробь, время младшего порядка элементы (если таковые имеются) должны быть опущены, а десятичная дробь должна быть разделенный на целую часть на десятичный знак, указанный в ISO 31-0, т.е. Запятая [,] или полная остановка [.]. Из них запятая предпочтительный знак.
Прост достаточно. Таким образом, согласно этой спецификации, доли секунды предпочтительнее записывать с использованием запятой, разделяющей целую и десятичную части, такие как 2014-01-01T00:00:00,123
. Однако кажется, что почти везде принимается только десятичная точка (ака "полная остановка" )
Теперь я уверен, что есть некоторые языки или библиотеки, которые учитывали это, и я знаю, что во многих случаях вы можете предоставить полную информацию о формате самостоятельно. Но это похоже на такой вопиющий контроль над спецификацией, и кажется, что большое количество программистов совершили ту же ошибку. Есть ли причина, почему это так, кроме чистой человеческой ошибки?
Ниже приведен список тех, где я тестировал. Не стесняйтесь редактировать вопрос, чтобы увеличить мой список, если найдете другие. Спасибо.
.NET/С#
DateTime dt = DateTime.Parse("2014-01-01T00:00:00,123");
Выдает сообщение FormatException
с сообщением "String не был признан действительным DateTime". То же самое с периодом, а не с запятой, успешно выполняется.
Объект даты JavaScript
Протестировано последним (на момент написания этой статьи) Chrome, Internet Explorer, Firefox и Node.js:
var dt = new Date('2014-01-01T00:00:00,123');
Возвращает "Invalid Date"
. Использование периода вместо этого отлично работает.
JavaScript с moment.js
var valid = moment("2014-01-01T00:00:00,123").isValid();
Возвращает false
. Использование периода вместо этого возвращает true
.
PHP
echo strtotime('2014-01-01T00:00:00,123');
Возвращает пустую строку. Использование периода вместо этого отлично работает.
рубин
require 'time'
puts Time.iso8601("2014-01-01T00:00:00,123")
Дает ошибку времени выполнения. Пока Time
не сохраняет дробные секунды, это не должно быть ошибкой - и действительно, если используется период, он работает.