Tolocaledatestring () изменения в IE11

в IE 11 я получаю забавные результаты с ToLocaleDateString (). Возвращаемая строка выглядит нормально в браузере, например "1/28/2014 11: 00: 46 AM", но затем, если я скопирую и вставлю это значение в текстовый редактор, это выглядит так:"?1?/?28?/?2014 ?11?:?00?:?46? ?АМ."

интересно, что если я вставляю текст в продукт Microsoft, он выглядит нормально... Проблема в том, что при попытке использовать значение программно для создания даты оно недопустимо. Вы можете проверить это, просто открыв поднимите консоль в IE11 и создайте новую дату, используя ToLocaleDateString (), а затем попытайтесь использовать полученную строку для создания новой даты в javascript или на языке по вашему выбору (я использую ASP.NET здесь...).

Я делаю что-то неправильно, или есть какой-то другой способ взаимодействия с датой javascript? Как я могу избавиться от этих забавных символов?

Edit: Благодаря комментарию ниже я смог выяснить, что неявные символы-это знаки слева направо. В зависимости от редактора, в который я вставляю значения и кодировку, которую использует редактор, текст будет отображаться по-разному: иногда с "?- иногда и без него.

5 ответов


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

...

я делаю что-то неправильно, или есть какой-то другой способ взаимодействия с датой javascript?

Да, вы делаете это неправильно. Вы не должны использовать функцию, предназначенную для форматирования чего-то для отображения человека в конкретной локали, и ожидать, что вывод будет разбираться машиной. Любой из выход toLocaleString, toLocaleDateString или toLocaleTimeString предназначены только для чтения человеком. (Как пояснил Берги в комментариях,toString также предназначен для отображения человека, но ECMA §15.9.4.2 говорит, что он должен туда и обратно)

вы, вероятно, получаете маркеры LTR, потому что ваш язык отображения RTL. Кроме того, учтите, что локаль всегда будет влиять на выходные данные. Возможно, ваш язык использует форматирование dd/mm/yyyy вместо форматирования mm/dd/yyyy. Или, возможно, ваш язык требует азиатских или арабских символов. Это все соображения при определении формата отображения, но они никогда не подходят для машинного анализа.

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

если намерение не является для отображения пользователю, то вы должны использовать одну из этих функций вместо этого:

  • toISOString даст вам форматированную метку времени ISO8601/RFC3339
  • toGMTString или toUTCString даст вам форматированную метку времени RFC822/RFC1123
  • getTime даст вам целочисленную метку времени Unix с точностью до миллисекунды

все вышеперечисленное вернет значение на основе UTC. Если вы хотите местное время, вы можете создать свою собственную строку с различными функциями доступа (getFullYear, getMonth, etc...), или вы можете использовать библиотеку, таких как момент.js:

это использует момент.js для возврата локального времени в формате ISO8601 + смещение от даты:

moment(theDate).format()   // ex:  "2014-08-14T13:32:21-07:00"

я исправил это со следующим replace(/[^ -~]/g,'') а в

(new Date("7/15/2014").toLocaleString().replace(/[^ -~]/g,'')

function FixLocaleDateString(localeDate) {
    var newStr = "";
    for (var i = 0; i < localeDate.length; i++) {
        var code = localeDate.charCodeAt(i);
        if (code >= 47 && code <= 57) {
            newStr += localeDate.charAt(i);
        }
    }
    return newStr;
}

возвращает только цифры и символ/. Вроде этого:

new Date(FixLocaleDateString(new Date("7/15/2014").toLocaleString()));

возвращает правильную дату. Без вызова FixLocaleDateString () результатом будет недопустимая дата.


для полноты, форма ответа:

на моей системе, методе объект Date, т. е. 11-это toLocaleDateString результаты "7/6/2014" при запуске в консоли, которая представлена в виде следующих байтов:

00000000  22 e2 80 8e 37 e2 80 8e  2f e2 80 8e 36 e2 80 8e  |"â.Z7â.Z/â.Z6â.Z|
00000010  2f e2 80 8e 32 30 31 34  22                       |/â.Z2014"|

не-печатные 0xe2 0x80 0x8e на протяжении которого UTF-8 представляет кодовую точку Юникода U + 200E. Это, как говорится в комментариях выше, метка слева направо.

Это JSFiddle кажется, нет проблем с использованием значение, возвращаемое из toLocaleDateString() вернуться к дате. По крайней мере, в моем IE 11.0.9600.17239 с обновлением версии 11.0.11 (KB2976627). Так, может быть, только консоль добавляет дополнительные символы?


var startDateConverted = new Date(start).toLocaleString().replace(/[^A-Za-z 0-9 \.,\?""!@#$%\^&\*\(\)-_=\+;:<>\/\\|\}\{\[\]`~]*/g, '')

Если вы также хотите удалить использовать время .split(' ').slice(0, -1).join(' ');