Отримайте локальний короткий формат дати за допомогою JavaScript


87

Чи можемо ми в будь-якому випадку дізнатись, використовуючи короткий формат дати, який використовується на панелі керування -> Регіональні та мовні налаштування?

Я знаю, що, використовуючи комбінацію наведених нижче, ми можемо отримати формат Довга назва локалі

toString()
toLocaleString()
toLocaleDateString()
toLocaleTimeString()

Але в JavaScript немає прямої функції, як toLocaleShortDateString().

Чи доступні сценарії, щоб дізнатись, що таке налаштування користувача?

Дякую.


Тільки, щоб переконатись, що я розумію: ви маєте на увазі гарячий спосіб отримати сам формат? оскільки назва "відсутньої функції" вводить вас в оману (toLocaleShortDateString), можливо щось на кшталт "getLocaleShortDateFormat"?
Amitay Dobo

Я знайшов відповіді на це пов'язане питання більш корисними для моїх цілей, оскільки я просто хочу надати напівпристойний стандарт за замовчуванням, для якого корисні представлені там рішення лише для клієнтів.
Kirk Woll

Відповіді:


171
function getLocaleDateString(){

var formats = {
   "ar-SA" : "dd/MM/yy",
   "bg-BG" : "dd.M.yyyy",
   "ca-ES" : "dd/MM/yyyy",
   "zh-TW" : "yyyy/M/d",
   "cs-CZ" : "d.M.yyyy",
   "da-DK" : "dd-MM-yyyy",
   "de-DE" : "dd.MM.yyyy",
   "el-GR" : "d/M/yyyy",
   "en-US" : "M/d/yyyy",
   "fi-FI" : "d.M.yyyy",
   "fr-FR" : "dd/MM/yyyy",
   "he-IL" : "dd/MM/yyyy",
   "hu-HU" : "yyyy. MM. dd.",
   "is-IS" : "d.M.yyyy",
   "it-IT" : "dd/MM/yyyy",
   "ja-JP" : "yyyy/MM/dd",
   "ko-KR" : "yyyy-MM-dd",
   "nl-NL" : "d-M-yyyy",
   "nb-NO" : "dd.MM.yyyy",
   "pl-PL" : "yyyy-MM-dd",
   "pt-BR" : "d/M/yyyy",
   "ro-RO" : "dd.MM.yyyy",
   "ru-RU" : "dd.MM.yyyy",
   "hr-HR" : "d.M.yyyy",
   "sk-SK" : "d. M. yyyy",
   "sq-AL" : "yyyy-MM-dd",
   "sv-SE" : "yyyy-MM-dd",
   "th-TH" : "d/M/yyyy",
   "tr-TR" : "dd.MM.yyyy",
   "ur-PK" : "dd/MM/yyyy",
   "id-ID" : "dd/MM/yyyy",
   "uk-UA" : "dd.MM.yyyy",
   "be-BY" : "dd.MM.yyyy",
   "sl-SI" : "d.M.yyyy",
   "et-EE" : "d.MM.yyyy",
   "lv-LV" : "yyyy.MM.dd.",
   "lt-LT" : "yyyy.MM.dd",
   "fa-IR" : "MM/dd/yyyy",
   "vi-VN" : "dd/MM/yyyy",
   "hy-AM" : "dd.MM.yyyy",
   "az-Latn-AZ" : "dd.MM.yyyy",
   "eu-ES" : "yyyy/MM/dd",
   "mk-MK" : "dd.MM.yyyy",
   "af-ZA" : "yyyy/MM/dd",
   "ka-GE" : "dd.MM.yyyy",
   "fo-FO" : "dd-MM-yyyy",
   "hi-IN" : "dd-MM-yyyy",
   "ms-MY" : "dd/MM/yyyy",
   "kk-KZ" : "dd.MM.yyyy",
   "ky-KG" : "dd.MM.yy",
   "sw-KE" : "M/d/yyyy",
   "uz-Latn-UZ" : "dd/MM yyyy",
   "tt-RU" : "dd.MM.yyyy",
   "pa-IN" : "dd-MM-yy",
   "gu-IN" : "dd-MM-yy",
   "ta-IN" : "dd-MM-yyyy",
   "te-IN" : "dd-MM-yy",
   "kn-IN" : "dd-MM-yy",
   "mr-IN" : "dd-MM-yyyy",
   "sa-IN" : "dd-MM-yyyy",
   "mn-MN" : "yy.MM.dd",
   "gl-ES" : "dd/MM/yy",
   "kok-IN" : "dd-MM-yyyy",
   "syr-SY" : "dd/MM/yyyy",
   "dv-MV" : "dd/MM/yy",
   "ar-IQ" : "dd/MM/yyyy",
   "zh-CN" : "yyyy/M/d",
   "de-CH" : "dd.MM.yyyy",
   "en-GB" : "dd/MM/yyyy",
   "es-MX" : "dd/MM/yyyy",
   "fr-BE" : "d/MM/yyyy",
   "it-CH" : "dd.MM.yyyy",
   "nl-BE" : "d/MM/yyyy",
   "nn-NO" : "dd.MM.yyyy",
   "pt-PT" : "dd-MM-yyyy",
   "sr-Latn-CS" : "d.M.yyyy",
   "sv-FI" : "d.M.yyyy",
   "az-Cyrl-AZ" : "dd.MM.yyyy",
   "ms-BN" : "dd/MM/yyyy",
   "uz-Cyrl-UZ" : "dd.MM.yyyy",
   "ar-EG" : "dd/MM/yyyy",
   "zh-HK" : "d/M/yyyy",
   "de-AT" : "dd.MM.yyyy",
   "en-AU" : "d/MM/yyyy",
   "es-ES" : "dd/MM/yyyy",
   "fr-CA" : "yyyy-MM-dd",
   "sr-Cyrl-CS" : "d.M.yyyy",
   "ar-LY" : "dd/MM/yyyy",
   "zh-SG" : "d/M/yyyy",
   "de-LU" : "dd.MM.yyyy",
   "en-CA" : "dd/MM/yyyy",
   "es-GT" : "dd/MM/yyyy",
   "fr-CH" : "dd.MM.yyyy",
   "ar-DZ" : "dd-MM-yyyy",
   "zh-MO" : "d/M/yyyy",
   "de-LI" : "dd.MM.yyyy",
   "en-NZ" : "d/MM/yyyy",
   "es-CR" : "dd/MM/yyyy",
   "fr-LU" : "dd/MM/yyyy",
   "ar-MA" : "dd-MM-yyyy",
   "en-IE" : "dd/MM/yyyy",
   "es-PA" : "MM/dd/yyyy",
   "fr-MC" : "dd/MM/yyyy",
   "ar-TN" : "dd-MM-yyyy",
   "en-ZA" : "yyyy/MM/dd",
   "es-DO" : "dd/MM/yyyy",
   "ar-OM" : "dd/MM/yyyy",
   "en-JM" : "dd/MM/yyyy",
   "es-VE" : "dd/MM/yyyy",
   "ar-YE" : "dd/MM/yyyy",
   "en-029" : "MM/dd/yyyy",
   "es-CO" : "dd/MM/yyyy",
   "ar-SY" : "dd/MM/yyyy",
   "en-BZ" : "dd/MM/yyyy",
   "es-PE" : "dd/MM/yyyy",
   "ar-JO" : "dd/MM/yyyy",
   "en-TT" : "dd/MM/yyyy",
   "es-AR" : "dd/MM/yyyy",
   "ar-LB" : "dd/MM/yyyy",
   "en-ZW" : "M/d/yyyy",
   "es-EC" : "dd/MM/yyyy",
   "ar-KW" : "dd/MM/yyyy",
   "en-PH" : "M/d/yyyy",
   "es-CL" : "dd-MM-yyyy",
   "ar-AE" : "dd/MM/yyyy",
   "es-UY" : "dd/MM/yyyy",
   "ar-BH" : "dd/MM/yyyy",
   "es-PY" : "dd/MM/yyyy",
   "ar-QA" : "dd/MM/yyyy",
   "es-BO" : "dd/MM/yyyy",
   "es-SV" : "dd/MM/yyyy",
   "es-HN" : "dd/MM/yyyy",
   "es-NI" : "dd/MM/yyyy",
   "es-PR" : "dd/MM/yyyy",
   "am-ET" : "d/M/yyyy",
   "tzm-Latn-DZ" : "dd-MM-yyyy",
   "iu-Latn-CA" : "d/MM/yyyy",
   "sma-NO" : "dd.MM.yyyy",
   "mn-Mong-CN" : "yyyy/M/d",
   "gd-GB" : "dd/MM/yyyy",
   "en-MY" : "d/M/yyyy",
   "prs-AF" : "dd/MM/yy",
   "bn-BD" : "dd-MM-yy",
   "wo-SN" : "dd/MM/yyyy",
   "rw-RW" : "M/d/yyyy",
   "qut-GT" : "dd/MM/yyyy",
   "sah-RU" : "MM.dd.yyyy",
   "gsw-FR" : "dd/MM/yyyy",
   "co-FR" : "dd/MM/yyyy",
   "oc-FR" : "dd/MM/yyyy",
   "mi-NZ" : "dd/MM/yyyy",
   "ga-IE" : "dd/MM/yyyy",
   "se-SE" : "yyyy-MM-dd",
   "br-FR" : "dd/MM/yyyy",
   "smn-FI" : "d.M.yyyy",
   "moh-CA" : "M/d/yyyy",
   "arn-CL" : "dd-MM-yyyy",
   "ii-CN" : "yyyy/M/d",
   "dsb-DE" : "d. M. yyyy",
   "ig-NG" : "d/M/yyyy",
   "kl-GL" : "dd-MM-yyyy",
   "lb-LU" : "dd/MM/yyyy",
   "ba-RU" : "dd.MM.yy",
   "nso-ZA" : "yyyy/MM/dd",
   "quz-BO" : "dd/MM/yyyy",
   "yo-NG" : "d/M/yyyy",
   "ha-Latn-NG" : "d/M/yyyy",
   "fil-PH" : "M/d/yyyy",
   "ps-AF" : "dd/MM/yy",
   "fy-NL" : "d-M-yyyy",
   "ne-NP" : "M/d/yyyy",
   "se-NO" : "dd.MM.yyyy",
   "iu-Cans-CA" : "d/M/yyyy",
   "sr-Latn-RS" : "d.M.yyyy",
   "si-LK" : "yyyy-MM-dd",
   "sr-Cyrl-RS" : "d.M.yyyy",
   "lo-LA" : "dd/MM/yyyy",
   "km-KH" : "yyyy-MM-dd",
   "cy-GB" : "dd/MM/yyyy",
   "bo-CN" : "yyyy/M/d",
   "sms-FI" : "d.M.yyyy",
   "as-IN" : "dd-MM-yyyy",
   "ml-IN" : "dd-MM-yy",
   "en-IN" : "dd-MM-yyyy",
   "or-IN" : "dd-MM-yy",
   "bn-IN" : "dd-MM-yy",
   "tk-TM" : "dd.MM.yy",
   "bs-Latn-BA" : "d.M.yyyy",
   "mt-MT" : "dd/MM/yyyy",
   "sr-Cyrl-ME" : "d.M.yyyy",
   "se-FI" : "d.M.yyyy",
   "zu-ZA" : "yyyy/MM/dd",
   "xh-ZA" : "yyyy/MM/dd",
   "tn-ZA" : "yyyy/MM/dd",
   "hsb-DE" : "d. M. yyyy",
   "bs-Cyrl-BA" : "d.M.yyyy",
   "tg-Cyrl-TJ" : "dd.MM.yy",
   "sr-Latn-BA" : "d.M.yyyy",
   "smj-NO" : "dd.MM.yyyy",
   "rm-CH" : "dd/MM/yyyy",
   "smj-SE" : "yyyy-MM-dd",
   "quz-EC" : "dd/MM/yyyy",
   "quz-PE" : "dd/MM/yyyy",
   "hr-BA" : "d.M.yyyy.",
   "sr-Latn-ME" : "d.M.yyyy",
   "sma-SE" : "yyyy-MM-dd",
   "en-SG" : "d/M/yyyy",
   "ug-CN" : "yyyy-M-d",
   "sr-Cyrl-BA" : "d.M.yyyy",
   "es-US" : "M/d/yyyy"
};

   return formats[navigator.language] || 'dd/MM/yyyy';

} 

51
Чому цей список так важко знайти в Інтернеті !!
sidonaldson

6
Це не повинно враховувати регістр, мій Safari повертається en-us.
QuentinUK

2
Локальний формат може бути різним (нестандартним), залежно від ОС
iegik

2
@Chexpir Проект CLDR Unicode є остаточним джерелом цього списку, а github.com/unicode-cldr/cldr-dates-modern - дещо більш витратна його версія. Все ще далеко від наведених даних. :)
Пол Ірланд

4
@PaulIrish, (new Intl.DateTimeFormat()).resolved.patternздається, не існує. Я отримую, Uncaught TypeError: Cannot read property 'pattern' of undefinedі я побачив помилку хрому щодо її видалення. .resolvedOptions()працює, але виключає шаблон.
webXL

66

Я думаю, що це найкращий спосіб зробити це ...

    var date = new Date();

    var options = {
        weekday: "short",
        year: "numeric",
        month: "2-digit",
        day: "numeric"
    };

console.log(
    date.toLocaleDateString("en", options) //en is language option, you may specify..
);

Додаткові параметри та їх приклади ....

 Option         Values and sample output

 weekday        narrow M
                short Mon
                long Monday

 year           2-digit 01
                numeric 2001

 month          2-digit 01
                numeric 1
                narrow J
                short Jan
                long January

day             2-digit 01
                numeric 1

hour            2-digit 12 AM
                numeric 12 AM

minute          2-digit 0
                numeric 0

second          2-digit 0
                numeric 0

timeZoneName    short 1/1/2001 GMT+00:00
                long 1/1/2001 GMT+00:00

Зверніть увагу, що IE (станом на 10) не поважає параметри і поверне назву місяця, що б ви не вказали.
Whelkaholism

Остання версія FF (25) демонструє однакову поведінку; здається, лише Chrome підтримує ці параметри.
Whelkaholism

Safari також ігнорує параметри.
wilsotc

1
для тих, хто вдарився зараз, підтримка набагато краща .. chrome & firefox обидва підтримували параметри деякий час, IE11 надалі підтримує .. Safari / Webkit все ще не підтримує
TygerKrash

Це чудова інформація. Було б навіть краще, якби ви посилалися на джерело для варіантів.
flipdoubt

13
function getLocaleShortDateString(d)
{
    var f={"ar-SA":"dd/MM/yy","bg-BG":"dd.M.yyyy","ca-ES":"dd/MM/yyyy","zh-TW":"yyyy/M/d","cs-CZ":"d.M.yyyy","da-DK":"dd-MM-yyyy","de-DE":"dd.MM.yyyy","el-GR":"d/M/yyyy","en-US":"M/d/yyyy","fi-FI":"d.M.yyyy","fr-FR":"dd/MM/yyyy","he-IL":"dd/MM/yyyy","hu-HU":"yyyy. MM. dd.","is-IS":"d.M.yyyy","it-IT":"dd/MM/yyyy","ja-JP":"yyyy/MM/dd","ko-KR":"yyyy-MM-dd","nl-NL":"d-M-yyyy","nb-NO":"dd.MM.yyyy","pl-PL":"yyyy-MM-dd","pt-BR":"d/M/yyyy","ro-RO":"dd.MM.yyyy","ru-RU":"dd.MM.yyyy","hr-HR":"d.M.yyyy","sk-SK":"d. M. yyyy","sq-AL":"yyyy-MM-dd","sv-SE":"yyyy-MM-dd","th-TH":"d/M/yyyy","tr-TR":"dd.MM.yyyy","ur-PK":"dd/MM/yyyy","id-ID":"dd/MM/yyyy","uk-UA":"dd.MM.yyyy","be-BY":"dd.MM.yyyy","sl-SI":"d.M.yyyy","et-EE":"d.MM.yyyy","lv-LV":"yyyy.MM.dd.","lt-LT":"yyyy.MM.dd","fa-IR":"MM/dd/yyyy","vi-VN":"dd/MM/yyyy","hy-AM":"dd.MM.yyyy","az-Latn-AZ":"dd.MM.yyyy","eu-ES":"yyyy/MM/dd","mk-MK":"dd.MM.yyyy","af-ZA":"yyyy/MM/dd","ka-GE":"dd.MM.yyyy","fo-FO":"dd-MM-yyyy","hi-IN":"dd-MM-yyyy","ms-MY":"dd/MM/yyyy","kk-KZ":"dd.MM.yyyy","ky-KG":"dd.MM.yy","sw-KE":"M/d/yyyy","uz-Latn-UZ":"dd/MM yyyy","tt-RU":"dd.MM.yyyy","pa-IN":"dd-MM-yy","gu-IN":"dd-MM-yy","ta-IN":"dd-MM-yyyy","te-IN":"dd-MM-yy","kn-IN":"dd-MM-yy","mr-IN":"dd-MM-yyyy","sa-IN":"dd-MM-yyyy","mn-MN":"yy.MM.dd","gl-ES":"dd/MM/yy","kok-IN":"dd-MM-yyyy","syr-SY":"dd/MM/yyyy","dv-MV":"dd/MM/yy","ar-IQ":"dd/MM/yyyy","zh-CN":"yyyy/M/d","de-CH":"dd.MM.yyyy","en-GB":"dd/MM/yyyy","es-MX":"dd/MM/yyyy","fr-BE":"d/MM/yyyy","it-CH":"dd.MM.yyyy","nl-BE":"d/MM/yyyy","nn-NO":"dd.MM.yyyy","pt-PT":"dd-MM-yyyy","sr-Latn-CS":"d.M.yyyy","sv-FI":"d.M.yyyy","az-Cyrl-AZ":"dd.MM.yyyy","ms-BN":"dd/MM/yyyy","uz-Cyrl-UZ":"dd.MM.yyyy","ar-EG":"dd/MM/yyyy","zh-HK":"d/M/yyyy","de-AT":"dd.MM.yyyy","en-AU":"d/MM/yyyy","es-ES":"dd/MM/yyyy","fr-CA":"yyyy-MM-dd","sr-Cyrl-CS":"d.M.yyyy","ar-LY":"dd/MM/yyyy","zh-SG":"d/M/yyyy","de-LU":"dd.MM.yyyy","en-CA":"dd/MM/yyyy","es-GT":"dd/MM/yyyy","fr-CH":"dd.MM.yyyy","ar-DZ":"dd-MM-yyyy","zh-MO":"d/M/yyyy","de-LI":"dd.MM.yyyy","en-NZ":"d/MM/yyyy","es-CR":"dd/MM/yyyy","fr-LU":"dd/MM/yyyy","ar-MA":"dd-MM-yyyy","en-IE":"dd/MM/yyyy","es-PA":"MM/dd/yyyy","fr-MC":"dd/MM/yyyy","ar-TN":"dd-MM-yyyy","en-ZA":"yyyy/MM/dd","es-DO":"dd/MM/yyyy","ar-OM":"dd/MM/yyyy","en-JM":"dd/MM/yyyy","es-VE":"dd/MM/yyyy","ar-YE":"dd/MM/yyyy","en-029":"MM/dd/yyyy","es-CO":"dd/MM/yyyy","ar-SY":"dd/MM/yyyy","en-BZ":"dd/MM/yyyy","es-PE":"dd/MM/yyyy","ar-JO":"dd/MM/yyyy","en-TT":"dd/MM/yyyy","es-AR":"dd/MM/yyyy","ar-LB":"dd/MM/yyyy","en-ZW":"M/d/yyyy","es-EC":"dd/MM/yyyy","ar-KW":"dd/MM/yyyy","en-PH":"M/d/yyyy","es-CL":"dd-MM-yyyy","ar-AE":"dd/MM/yyyy","es-UY":"dd/MM/yyyy","ar-BH":"dd/MM/yyyy","es-PY":"dd/MM/yyyy","ar-QA":"dd/MM/yyyy","es-BO":"dd/MM/yyyy","es-SV":"dd/MM/yyyy","es-HN":"dd/MM/yyyy","es-NI":"dd/MM/yyyy","es-PR":"dd/MM/yyyy","am-ET":"d/M/yyyy","tzm-Latn-DZ":"dd-MM-yyyy","iu-Latn-CA":"d/MM/yyyy","sma-NO":"dd.MM.yyyy","mn-Mong-CN":"yyyy/M/d","gd-GB":"dd/MM/yyyy","en-MY":"d/M/yyyy","prs-AF":"dd/MM/yy","bn-BD":"dd-MM-yy","wo-SN":"dd/MM/yyyy","rw-RW":"M/d/yyyy","qut-GT":"dd/MM/yyyy","sah-RU":"MM.dd.yyyy","gsw-FR":"dd/MM/yyyy","co-FR":"dd/MM/yyyy","oc-FR":"dd/MM/yyyy","mi-NZ":"dd/MM/yyyy","ga-IE":"dd/MM/yyyy","se-SE":"yyyy-MM-dd","br-FR":"dd/MM/yyyy","smn-FI":"d.M.yyyy","moh-CA":"M/d/yyyy","arn-CL":"dd-MM-yyyy","ii-CN":"yyyy/M/d","dsb-DE":"d. M. yyyy","ig-NG":"d/M/yyyy","kl-GL":"dd-MM-yyyy","lb-LU":"dd/MM/yyyy","ba-RU":"dd.MM.yy","nso-ZA":"yyyy/MM/dd","quz-BO":"dd/MM/yyyy","yo-NG":"d/M/yyyy","ha-Latn-NG":"d/M/yyyy","fil-PH":"M/d/yyyy","ps-AF":"dd/MM/yy","fy-NL":"d-M-yyyy","ne-NP":"M/d/yyyy","se-NO":"dd.MM.yyyy","iu-Cans-CA":"d/M/yyyy","sr-Latn-RS":"d.M.yyyy","si-LK":"yyyy-MM-dd","sr-Cyrl-RS":"d.M.yyyy","lo-LA":"dd/MM/yyyy","km-KH":"yyyy-MM-dd","cy-GB":"dd/MM/yyyy","bo-CN":"yyyy/M/d","sms-FI":"d.M.yyyy","as-IN":"dd-MM-yyyy","ml-IN":"dd-MM-yy","en-IN":"dd-MM-yyyy","or-IN":"dd-MM-yy","bn-IN":"dd-MM-yy","tk-TM":"dd.MM.yy","bs-Latn-BA":"d.M.yyyy","mt-MT":"dd/MM/yyyy","sr-Cyrl-ME":"d.M.yyyy","se-FI":"d.M.yyyy","zu-ZA":"yyyy/MM/dd","xh-ZA":"yyyy/MM/dd","tn-ZA":"yyyy/MM/dd","hsb-DE":"d. M. yyyy","bs-Cyrl-BA":"d.M.yyyy","tg-Cyrl-TJ":"dd.MM.yy","sr-Latn-BA":"d.M.yyyy","smj-NO":"dd.MM.yyyy","rm-CH":"dd/MM/yyyy","smj-SE":"yyyy-MM-dd","quz-EC":"dd/MM/yyyy","quz-PE":"dd/MM/yyyy","hr-BA":"d.M.yyyy.","sr-Latn-ME":"d.M.yyyy","sma-SE":"yyyy-MM-dd","en-SG":"d/M/yyyy","ug-CN":"yyyy-M-d","sr-Cyrl-BA":"d.M.yyyy","es-US":"M/d/yyyy"};

    var l=navigator.language?navigator.language:navigator['userLanguage'],y=d.getFullYear(),m=d.getMonth()+1,d=d.getDate();
    f=(l in f)?f[l]:"MM/dd/yyyy";
    function z(s){s=''+s;return s.length>1?s:'0'+s;}
    f=f.replace(/yyyy/,y);f=f.replace(/yy/,String(y).substr(2));
    f=f.replace(/MM/,z(m));f=f.replace(/M/,m);
    f=f.replace(/dd/,z(d));f=f.replace(/d/,d);
    return f;
}

за допомогою:

shortedDate=getLocaleShortDateString(new Date(1992, 0, 7));


1
Це працює, але, на жаль, він не піклується про двобуквенні мовні коди, які надсилають деякі браузери (я маю на увазі Firefox, даючи мені, наприклад, "da" замість "da-DK"). Думаю, я просто додам двобуквені коди для мов, які я хочу підтримувати, але справді крутим рішенням було б знайти та встановити за замовчуванням якусь назву культури мови з двозначного коду.
Алвіс

Привіт @ holden321 Чи можу я отримати місцевий час і конвертувати у формат дд / мм / рррр? Я задав питання stackoverflow.com/questions/36226676/…, але мені ніхто не допомагає.
Аваніш Кумар

1
Це працює в браузері, але не в NodeJS. NodeJS буде виробляти однаковий формат, завжди з різними параметрами вище.
Донато

10

Це неможливо зробити.

JavaScript у різних браузерах не має можливості використовувати фактичний формат короткої дати, вибраний користувачем на платформах, що пропонують таку регіональну настройку. Крім того, у JavaScript є величезні діри, коли йдеться про будь-яке форматування. Подивіться, скільки клопоту з нульовим забиванням!

Ви можете докласти всіх зусиль, щоб отримати налаштування мови та отримати типовий формат для цієї мови. Це багато роботи, коли ви навіть не знаєте, чи це правильний регіон (я б поспорився, що заголовки міжнародних мов часто неправильні чи недостатньо конкретні), або якщо користувач налаштував формат на щось інше.

Ви можете спробувати використати клієнтський VBScript (який має функції для всіх цих регіональних перестановок форматування), але це не є гарною ідеєю, оскільки це вмираюча (мертва?) Технологія IE.

Ви також можете спробувати скористатися Java / Flash / Silverlight, щоб викопати формат. Це також велика додаткова робота, але, можливо, найкращі шанси на успіх. Ви хочете кешувати його для сеансу, щоб мінімізувати накладні витрати.

Сподіваємось, елемент HTML5 <time> забезпечить деяке полегшення для відображення дати / часу i18n.


8

Якщо у вас питання щодо <input type="date">поля, ось сценарій для отримання value=""атрибута подання :

(new Date()).toISOString().split('T')[0]

Ви можете використовувати об’єкт Intl ( ecma-402 ), щоб отримати data-date-pattern="":

(new Intl.DateTimeFormat()).resolved.pattern // "M/d/y" for "en-US" in Google Chrome

І нарешті, для форматування дати в поточному l10n data-date="":

(new Intl.DateTimeFormat()).format(new Date());

Polyfill: https://github.com/andyearnshaw/Intl.js/issues/129


1
Чи вирішено об’єкт (new Intl.DateTimeFormat ()). У стандартах? Він не задокументований у MDN ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) і не працює у Firefox.
vcarel

2
(new Intl.DateTimeFormat()).resolved.patternгенерує помилку в Google Chrome. (new Intl.DateTimeFormat()).resolvedє undefined. Це не рішення для отримання рядка форматування, але ви можете скористатися ним, ((new Intl.DateTimeFormat()).format(new Date());щоб отримати відформатований рядок дати.
Karl Wilbur

Наразі (new Intl.DateTimeFormat()).resolvedOptions()- - дасть вам об’єкт форматування
iegik

@iegik resolvedOptionsвидає лише грубі дані (принаймні на Chrome 80), наприклад. інформація про тривалість подання року, порядок компонентів дати, роздільник компонентів дати відсутні.
колапсар

7

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat

Об'єкт Intl.DateTimeFormat - це конструктор для об'єктів, які дозволяють форматувати дату та час, чутливі до мови.

var date = new Date(2014, 11, 31, 12, 30, 0);

var formatter = new Intl.DateTimeFormat("ru");
console.log( formatter.format(date) ); // 31.12.2014

var formatter = new Intl.DateTimeFormat("en-US");

console.log(formatter.format(date)); // 12/31/2014

формат поточної зони:

console.log(new Intl.DateTimeFormat(Intl.DateTimeFormat().resolvedOptions().locale).
format(new Date()))

5

Я не знаю способу, як це зробити (ви можете отримати мову і спробувати відняти локаль від цього).

Я намагався приготувати дещо, щоб спробувати зробити це (протестовано на Firefox з однією мовою). має працювати до тих пір, поки короткий рядок дати включає дату як цифри, тому він може не працювати, скажімо, арабською. У нього можуть бути й інші помилки, я не знаю всіх особливостей локалей, це просто концепція ...

function getShortDateFormat() {
    var d = new Date(1992, 0, 7);
    var s = d.toLocaleDateString();

    function formatReplacer(str) {
        var num = parseInt(str);
        switch (num % 100) {
            case 92:
                return str.replace(/.{1}/g, "Y");
            case 1:
                return str.length == 1 ? "mM" : "MM"
            case 7:
                return str.length == 1 ? "dD" : "DD"
        }
    }

    shortDateFormat = s.replace(/\d+/g, formatReplacer);
    return shortDateFormat;
}

getShortDateFormat();

Виведений формат буде:

  • Y: кількість цифр, що представляють роки
  • dD = короткий день (тобто використовуйте лише одну цифру, коли це можливо)
  • DD = формат довгого дня (тобто завжди дві цифри)
  • мМ / ММ - однакові протягом місяців

Тож у моєму браузері короткий формат дати ви отримуєте "MM / DD / YYYY".


Я отримую: "martes, DD de enero de YYYY"
Альваро Гонсалес

Тоді, очевидно, мені потрібна ще якась робота над цим :) (протестовано лише на Firefox 3.5 / Linux)
Amitay Dobo 13.03.10

повернення невизначеної в дату частини на хром 38 X11
Steel Brain

3

Це залежить від реалізації браузера toLocaleDateString(). Наприклад, у chrome ви отримаєте щось на зразок:Tuesday, January DD, YYYY


2

Незначна модифікація відповіді Міталі. Динамічно генерувати мову для більш локалізованого рішення.

var lang= window.navigator.userLanguage || window.navigator.language;

var date = new Date();

var options = {
   weekday: "short",
   year: "numeric",
   month: "2-digit",
   day: "numeric"
};

date.toLocaleDateString(lang, options);

2

Я вважаю, що ви можете використовувати цей:

new Date().toLocaleDateString();

Які можуть приймати параметри для мови:

new Date().toLocaleDateString("en-us");
new Date().toLocaleDateString("he-il");

Я бачу, що це підтримується chrome, IE, edge, хоча результати можуть відрізнятися, це робить для мене досить гарну роботу.


2
new Date(YOUR_DATE_STRING).toLocaleDateString(navigator.language)

~ поєднання відповідей вище


1

Не існує простого шляху. Якщо ви хочете отримати надійне крос-браузерне рішення, вам доведеться створити пошукову таблицю рядків дати та формату часу за культурою. Для форматування дати проаналізуйте відповідний рядок форматування, витягніть відповідні частини з дати, тобто дня, місяця, року, та додайте їх разом.

Це, по суті, те, що Microsoft робить зі своєю бібліотекою AJAX, як показано у відповіді @ no.


1

Знайшов цей потік, шукаючи спосіб генерувати локалізовані, але короткі дати у всіх браузерах без зайвої бібліотеки, просто простий виклик форматування дат ISO, створених сервером.

Я пішов із комбінацією holden321 та відповідей mwrf. Зберігання форматів, зовнішніх для функції, оскільки це зручніше таким чином, та збереження поточного формату мови, оскільки це завжди корисно.

Функція може передавати все, що можна передати конструктору дати, щоб отримати дійсну дату, а також мову або формат для гнучкості.

Спочатку потрібно встановити список форматів і ще кілька речей:

var LOCALE_DATE_FORMATS = {
  // as per mwrf's list
  ...
}

var LANG = window.navigator.userLanguage || window.navigator.language;

var LOCALE_DATE_FORMAT = LOCALE_DATE_FORMATS[LANG] || 'dd/MM/yyyy';

Тоді функція:

function getLocalizedDate(o, options)
{
    var res = '';
    var date = new Date(o);     

    if(o != null && !isNaN(date) && typeof(date.getFullYear) == 'function')
    {
        var d = date.getDate();
        var dd = d < 10 ? '0' + d : d;
        var M = date.getMonth() + 1;
        var MM = M < 10 ? '0' + M : M;
        var yyyy = date.getFullYear();
        var yy = new String(yyyy).substring(2);

        var format = LOCALE_DATE_FORMAT;

        if(options && options.lang)
            format = LOCALE_DATE_FORMATS[options.lang];
        else if(options && options.format)
            format = options.format;

        res = format
            .replace(/dd/g, dd)
            .replace(/d/g, d)
            .replace(/MM/g, MM)
            .replace(/M/g, M)
            .replace(/yyyy/g, yyyy)
            .replace(/yy/g, yy);
    }

    return res;
}

getLocalizedDate('2013-03-01T00:00:00', {lang:'sk-SK'}) = 1. 3. 2013

EDIT: Зателефонуйте без аргументів, щоб використовувати локаль користувача, звичайно:

getLocalizedDate('2013-03-01T00:00:00')= 01/03/2013(для мене)

Якщо ви любите розширювати прототипи, першими рядками визначення функції стають:

Date.prototype.getLocalized = function(options)
{
  var date = this;

Називається звичайно так:

new Date('2013-03-01T00:00:00').getLocalized({lang:'sk-SK'}) = 1. 3. 2013

РЕДАГУВАТИ: Знову ж, виклик без аргументів для використання локалі користувача:

new Date('2013-03-01T00:00:00').getLocalized()= 01/03/2013(для мене)


-3

Спробуйте це:

new Date().toLocaleFormat("%x");

Усі формати для цієї функції можна знайти тут: http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html


4
використання цього методу завдало мені стільки болю, що мені довелося його викинути. Chrome не розпізнає.
KevinDeus

Я повинен погодитися з попередніми коментаторами: тримайтеся подалі від цієї функції, якщо можете.
ADi3ek

-5

Спробуйте використовувати Date.CultureInfo.formatPatterns.shortDate


3
Запитання вимагає JavaScript, а не C #.
Izzy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.