Obtenha o formato de data abreviada de local usando javascript

87

Existe alguma maneira que possamos saber usando JavaScript o formato de data abreviada usado no Painel de controle -> Configurações regionais e de idioma?

Sei que usando a combinação a seguir, podemos obter o formato do nome longo do local

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

Mas não há função direta em JavaScript como toLocaleShortDateString().

Há algum script disponível para descobrir qual é a configuração do usuário?

Obrigado.

lelol
fonte
Só para ter certeza de que entendi: você quer dizer quente para obter o formato em si? porque o nome da "função ausente" que você deu é enganoso (toLocaleShortDateString), talvez algo como "getLocaleShortDateFormat"?
Amitay Dobo,
Achei as respostas a essa pergunta relacionada mais úteis para meus propósitos, pois desejo apenas fornecer um padrão decente para o qual as soluções exclusivas do lado do cliente apresentadas lá são úteis.
Kirk Woll

Respostas:

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';

} 
mwrf
fonte
51
Por que essa lista é tão difícil de encontrar na internet !!
Sidonaldson
6
Isso precisa ser insensível a maiúsculas e minúsculas, meu Safari retorna en-us.
QuentinUK
2
O formato local pode ser diferente (personalizado), depende do sistema operacional
iegik
2
@Chexpir O projeto Unicode CLDR é a fonte final desta lista e github.com/unicode-cldr/cldr-dates-modern é uma versão um pouco mais consumível dele. Ainda muito longe dos dados acima. :)
Paul Irish,
4
@PaulIrish (new Intl.DateTimeFormat()).resolved.patternparece estar extinto. Estou recebendo Uncaught TypeError: Cannot read property 'pattern' of undefinede vi um bug de cromo sobre como remover isso. .resolvedOptions()funciona, mas exclui o padrão.
webXL de
66

Acho que esta é a melhor forma de o fazer ...

    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..
);

Mais opções e seus exemplos ....

 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
Mitali
fonte
Observe que o IE (a partir de 10) não respeita as opções e retornará o nome do mês conforme especificado.
Whelkaholism
A última versão do FF face (25) exibe o mesmo comportamento; parece que apenas o Chrome suporta as opções.
Whelkaholism
O Safari também ignora opções.
wilsotc 01 de
1
para qualquer um que acesse agora, o suporte é muito melhor .. chrome & firefox já suportam as opções há algum tempo, o IE11 em diante suporta .. Safari / Webkit ainda não
TygerKrash
Esta é uma ótima informação. Seria ainda melhor se você vinculasse a uma fonte para as opções.
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;
}

usando:

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

holden321
fonte
1
Isso funciona, mas infelizmente não cuida dos códigos de idioma de duas letras que alguns navegadores enviam (estou me referindo ao firefox, por exemplo, "da" em vez de "da-DK"). Acho que vou apenas adicionar os códigos de duas letras para os idiomas que desejo oferecer suporte, mas a solução realmente legal seria encontrar e usar como padrão algum Nome de Cultura de Idioma a partir do código de duas letras.
Alvis
Olá @ holden321 Posso obter a hora local e converter para o formato dd / MM / aaaa? Eu fiz uma pergunta stackoverflow.com/questions/36226676/… mas ninguém me ajudou.
Avanish Kumar
1
Isso funciona no navegador, mas não no NodeJS. O NodeJS produzirá o mesmo formato sempre com as diferentes opções acima.
Donato
10

Não pode ser feito.

O JavaScript entre navegadores não tem como usar o formato de data abreviada real selecionado pelo usuário em plataformas que oferecem essa personalização regional. Além disso, o JavaScript tem enormes lacunas no que diz respeito a qualquer tipo de formatação. Veja como o preenchimento zero é incômodo!

Você pode fazer um grande esforço para obter a configuração de idioma e obter o formato típico para esse local. Dá muito trabalho quando você nem sabe se é o local correto (aposto que os cabeçalhos de idiomas internacionais costumam estar incorretos ou não são específicos o suficiente) ou se o usuário personalizou o formato para outra coisa.

Você pode tentar usar o cliente VBScript (que tem funções para todas essas permutações de formatação regionais), mas isso não é uma boa ideia porque é uma tecnologia específica do IE em extinção (morta?).

Você também pode tentar usar Java / Flash / Silverlight para descobrir o formato. Isso também é uma grande quantidade de trabalho extra, mas pode ter a melhor chance de sucesso. Você deseja armazená-lo em cache para a sessão para minimizar a sobrecarga.

Esperançosamente, o elemento HTML5 <time> fornecerá algum alívio para a exibição de data / hora i18n.

brianary
fonte
8

Se sua dúvida sobre o <input type="date">campo, aqui está o script para obter o value=""atributo arquivado :

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

Você pode usar o objeto Intl ( ecma-402 ) para obter data-date-pattern="":

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

E, finalmente, para formatar a data no l10n atual data-date="":

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

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

iegik
fonte
1
O objeto (new Intl.DateTimeFormat ()). Está resolvido nos padrões? Não está documentado no MDN ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) e não funciona no Firefox.
vcarel
2
(new Intl.DateTimeFormat()).resolved.patterngera um erro no Google Chrome. (new Intl.DateTimeFormat()).resolvedé undefined. Esta não é uma solução para obter a string de formato, mas você pode usar ((new Intl.DateTimeFormat()).format(new Date());para obter uma string de data formatada.
Karl Wilbur
Por enquanto, (new Intl.DateTimeFormat()).resolvedOptions()- lhe dará o formato do objeto
iegik
@iegik resolvedOptions produz dados grosseiros apenas (no Chrome 80, pelo menos), por exemplo. informações sobre a duração da representação do ano, a ordem dos componentes da data e o separador dos componentes da data estão ausentes.
recolhido em
7

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

O objeto Intl.DateTimeFormat é um construtor para objetos que permitem a formatação de data e hora sensível à linguagem.

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

formato da sua zona atual:

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

Eu não sei como fazer isso (você pode pegar a linguagem e tentar deduzir a localidade disso).

Tentei cozinhar algo para tentar fazer isso (testei apenas no Firefox com um local). deve funcionar, desde que a string de data curta inclua a data como dígitos, então pode falhar para, digamos, árabe. Pode ter outros bugs também, não conheço todas as peculiaridades de locais diferentes, isso é apenas um conceito ...

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();

O formato de saída será:

  • Y: o número de dígitos para representar os anos
  • dD = dia curto (ou seja, use apenas um dígito quando possível)
  • DD = formato de dia longo (ou seja, sempre dois dígitos)
  • mM / MM - o mesmo para meses

Portanto, no meu navegador, o shortDateformat que você obtém é "MM / DD / AAAA".

Amitay Dobo
fonte
Eu recebo: "martes, DD de enero de YYYY"
Álvaro González
Então, obviamente, preciso trabalhar mais nisso :) (testado apenas no Firefox 3.5 / Linux)
Amitay Dobo
retornando indefinido na parte da data no Chrome 38 X11
Steel Brain
3

Isso depende da toLocaleDateString()implementação do navegador . Por exemplo, no Chrome você obterá algo como:Tuesday, January DD, YYYY

Gonzalo
fonte
2

Ligeira modificação na resposta de Mitali. Para gerar dinamicamente o idioma para uma solução mais localizada.

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);
Brandon Nozaki Miller
fonte
2

Eu acredito que você pode usar este:

new Date().toLocaleDateString();

Que pode aceitar parâmetros para a localidade:

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

Vejo que é compatível com o Chrome, IE, edge, embora os resultados possam variar, ele faz um bom trabalho para mim.

Shai Petel
fonte
2
new Date(YOUR_DATE_STRING).toLocaleDateString(navigator.language)

~ combinação das respostas acima

Boern
fonte
1

Não existe uma maneira fácil. Se você quiser uma solução confiável para vários navegadores, terá que construir uma tabela de pesquisa de strings de formato de data e hora, por cultura. Para formatar uma data, analise a string de formato correspondente, extraia as partes relevantes da data, ou seja, dia, mês, ano e anexe-as.

Isso é essencialmente o que a Microsoft faz com sua biblioteca AJAX, conforme mostrado na resposta de @ não.

Alekop
fonte
1

Encontrei este tópico enquanto procurava uma maneira de gerar datas localizadas, mas curtas, em todos os navegadores sem nenhuma biblioteca extra, apenas uma simples chamada para formatar datas ISO geradas pelo servidor.

Fui com uma combinação das respostas de holden321 e mwrf. Armazenar os formatos externos à função porque é mais prático dessa forma e armazenar o formato de localidade atual porque é sempre útil.

A função pode ser passada para qualquer coisa que possa ser passada para um construtor de data para obter uma data válida e também um idioma ou formato para flexibilidade.

Você precisa configurar a lista de formatos e mais algumas coisas primeiro:

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';

Então a função é:

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: Chame sem argumentos para usar a localidade do usuário, é claro:

getLocalizedDate('2013-03-01T00:00:00')= 01/03/2013(para mim)

Se você é um fã de estender protótipos, as primeiras linhas da definição da função se tornam:

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

Chamado, é claro, assim:

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

EDIT: Novamente, chame sem argumentos para usar a localidade do usuário:

new Date('2013-03-01T00:00:00').getLocalized()= 01/03/2013(para mim)

Whelkaholism
fonte
-3

Experimente isto:

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

Todos os formatos para esta função podem ser encontrados aqui: http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html

user838708
fonte
4
usar esse método me causou tanta dor que tive de jogá-lo fora. O Chrome não o reconhecerá.
KevinDeus
Eu tenho que concordar com comentários anteriores: Fique longe dessa função, se puder.
ADi3ek
-5

Tente usar Date.CultureInfo.formatPatterns.shortDate

Ben
fonte
3
A pergunta pede javascript, não C #.
Izzy