Microsoft Edge javascript toLocaleTimeString неверный интервал

У меня возникли проблемы с пониманием того, что происходит с некоторым JavaScript, который, кажется, ведет себя по-другому в Edge. В частности, это сводилось к следующему:

var testi = new Date().toLocaleTimeString();
var len2 = testi.length;
alert(len2);

Моя длина в Edge составляет 17, в Chrome и IE - 10. Кажется, в строке есть несколько фантомных пробелов, это также испортило мою попытку подстроки.

https://jsfiddle.net/m1m8h7ym/

К вашему сведению, мой часовой пояс - Центральный США.


person Aaron    schedule 19.08.2015    source источник
comment
Зачем вам нужны строковые операции с результатом toLocaleString, когда вы можете извлечь любую часть объекта даты?   -  person marekful    schedule 19.08.2015
comment
Моя цель состояла в том, чтобы пользователь столкнулся со строкой времени в формате 09:30, и мне не хотелось самому выполнять преобразование 24-часового времени в AM/PM и часовой пояс, поэтому я вырезал секунды из toLocaleTimeString(), что привело мне, чтобы обнаружить эту ошибку JavaScript (причуда?) Это какой-то старый код, который мы только начали видеть после обновления нескольких пользователей до Windows 10. Отлично работает в IE, Chrome и Firefox   -  person Aaron    schedule 19.08.2015


Ответы (1)


Похоже, Microsoft использует невидимую отметку слева направо. Это также происходит в IE11 в режиме Edge. Я понял это, перебирая каждый символ в строке и передавая его в encodeURIComponent()

var output = document.getElementById("output");
var testi = new Date().toLocaleTimeString();
var row;
for (var i = 0, len = testi.length; i < len; i++) {
    row = document.createElement("pre");
    row.innerHTML = encodeURIComponent(testi[i]);
    output.appendChild(row);
}
<div id="output"></div>

Вы можете удалить его, удалив его юникод, который может быть захвачен в регулярном выражении выражением \u200E.

var output = document.getElementById("output");
var testi = new Date().toLocaleTimeString().replace(/\u200E/g,"");
var row;
for (var i = 0, len = testi.length; i < len; i++) {
    row = document.createElement("pre");
    row.innerHTML = encodeURIComponent(testi[i]);
    output.appendChild(row);
}
<div id="output"></div>

person Thriggle    schedule 19.08.2015
comment
Большой! Исправил мой код для Edge, добавив .replace(/\u200E/g,"") к вызову .toLocaleTimeString() Теперь работает во всех браузерах, спасибо! - person Aaron; 19.08.2015
comment
Рад, что смог помочь! Просто имейте в виду, что строка, возвращаемая .toLocaleTimeString(), может значительно различаться в разных локалях/культурах. Я не удивлюсь, если при использовании иврита/арабского языка по умолчанию в браузере появится контрольная отметка справа налево. - person Thriggle; 19.08.2015
comment
Хорошее предупреждение, повезло, это внутренняя веб-страница американской компании с несколькими часовыми поясами, я бы не рекомендовал ее для внешнего использования. - person Aaron; 19.08.2015