Подтвердить что ты не робот

Изменения в ToLocaleDateString() в IE11

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

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

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

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

4b9b3361

Ответ 1

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

...

Я делаю что-то не так, или есть другой способ, которым я должен взаимодействовать с датой 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 и т.д.), Или вы можете использовать библиотеку, такую ​​как moment.js:

Это использует moment.js, чтобы вернуть ISO8601 отформатированное локальное время + смещение с даты:

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

Ответ 2

Я установил, что со следующим replace(/[^ -~]/g,''), как в

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

Ответ 3

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

В моей системе метод объекта IE 11 Date 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 представление кодовой точки Unicode U + 200E. Что, как говорится выше, означает ЛЕВУЮ-ПРАВУЮ МАРКУ.

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

Ответ 4

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() результат будет недопустимой.