Обнаружение с помощью javascript, если пользовательская машина использует 12-часовые часы (am/pm) или 24 часа (военное время)

Можно ли определить, использует ли пользовательская машина 12-часовые часы (am/pm) или 24-часовые часы (военное время)?

Один из способов - проверить локали пользователей, но тогда это всего лишь массивный список локальных сопоставлений, и кто-то из U.S, который хочет 12-часовое время, может отправить мне только en locale, а не US_en, и у меня нет способа узнать ее предпочтения. В то же время кто-то из U.S может установить свою машину для использования 12-часового формата времени и не хочет 12-часовых часов.

EDIT:

date.toLocaleTimeString();

Поработал бы это теорией, как предложил пользователь Mouser ниже, но, к сожалению, прослушивание в браузерах WebKit (протестировано в Chrome и новой Opera на Windows) и почему-то всегда возвращает am/pm время.

Пример: http://jsfiddle.net/sjuaL3p4/

Итак, я предполагаю, что мне придется перефразировать мой вопрос, если кто-то имеет представление о том, как это сделать в браузерах webkit.

Ответ 1

Это решение работает в большинстве браузеров, но содержит ошибки в Chrome.

    var date = new Date(Date.UTC(2012, 11, 12, 3, 0, 0));
    var dateString = date.toLocaleTimeString();

    //apparently toLocaleTimeString() has a bug in Chrome. toString() however returns 12/24 hour formats. If one of two contains AM/PM execute 12 hour coding.
    if (dateString.match(/am|pm/i) || date.toString().match(/am|pm/i) )
    {
        //12 hour clock
        console.log("12 hour");
    }
    else
    {
        //24 hour clock
        console.log("24 hour");
    }

Ответ 2

toLocaleTimeString должно указывать время в формате, который отражает пользовательские настройки, но ненадежен.

Я нахожусь в системе Debian. Выходной сигнал locale:

LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

Вот несколько экспериментов с date:

$ date +%X
05:23:32 PM
$ LANG=en_GB date +%X
17:24:06
$ LC_TIME=en_GB date +%X
17:24:22

Формат %X сообщает date выводить время согласно языку. Результаты, приведенные выше, точно так же, как ожидалось. Настройка LC_TIME - это способ изменить только формат времени, но сохранить все остальное в локали неповрежденным. Поэтому кто-то из США может использовать формат 24 часа, даже если по умолчанию для en_US будет 12.

Я пробовал Mouser script в моей системе:

$ firefox --no-remote
[Shows a time in the 12 hour format, as expected.]
$ LANG=en_GB firefox --no-remote
[Shows a time in the 24 hour format, as expected.]

Пока все хорошо. Тем не менее,

$ LC_TIME=en_GB firefox --no-remote
[Shows a time in the 12 hour format, this is wrong!]

Я получаю те же результаты с Chrome. Кажется, что Firefox и Chrome игнорируют LC_TIME.

Ответ 3

Помимо того, что этого никогда не должно быть сделано, .toLocaleTimeString() не будет хорошим решением, даже если оно работает в браузерах. Он возвращает строку времени, следуя формату, установленному пользовательским компьютером, но возможно иметь 24-часовые часы, которые все еще показывают AM/PM, а также 12-часовые часы, которых нет. Невозможно точно или надежно обнаружить это.

Ответ 4

Эта простая строка работает для меня.

var is24 = ((new Date(2014, 01, 01, 15, 0, 0, 0)).toLocaleTimeString().indexOf("15") > -1);

Хотя он все еще не работает в Chrome (работает в IE и Firefox)