如何使用javascript(格式为dd / mm或mm / dd)确定用户的区域设置日期格式?

时间:2017-04-12 11:46:42

标签: javascript date datetime momentjs datetime-format

我正在尝试确定用户的区域设置日期格式,以便稍后我可以使用它以特定格式显示日期。

我知道我可以使用toLocaleDateString()来获取日期格式。

我们说我得到1/2/2017。如何确定这是dd/mm格式还是mm/dd格式?

我尝试过的一件事是我可以从new Date()获取当前日期和月份,然后根据(手动)进行检查。当日期为2/2/20163/3/2016时,如何确定哪一个是日期,哪一个是月?

这个问题有没有解决方案?

我也调查了moment.js。如果有一些解决方案,我也很乐意使用它。

5 个答案:

答案 0 :(得分:1)

使用片刻localeData,您可以获得本地化longDateFormat。这将为您提供年,月和日的本地化格式。您可以使用此值将parse输入字符串设置为区域设置。

这是一个实例:



// Get user locale
var locale = window.navigator.userLanguage || window.navigator.language;
// Set locale to moment
moment.locale(locale);

// Get locale data
var localeData = moment.localeData();
var format = localeData.longDateFormat('L');

var m1 = moment('2/2/2016', format);
console.log(m1.format()); // February 2nd 2016
console.log(m1.format(format) + ' using format: ' + format);

var m2 = moment('5/1/2017', format);
console.log(m2.format());
console.log(m2.format(format) + ' using format: ' + format);
// January 5th 2017 for locales that use DD/MM/YYYY
// May 1st 2017 for locales that use MM/DD/YYYY

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment-with-locales.min.js"></script>
&#13;
&#13;
&#13;

此代码不适用于使用以年份开头的格式的区域设置(例如匈牙利语区域设置为YYYY.MM.DD.

答案 1 :(得分:1)

在2019年对此进行回答。如果您真的想透彻一点,可以尝试处理市场份额低的旧版浏览器,非拉丁编号系统或非格雷戈里日历。

这可以全部替换为正则表达式,但是如果要解析日期,则需要保留字段索引。

function dateFormat(language) {
  const sample = window.Intl ? new Intl.DateTimeFormat(language).format(new Date(1970, 11, 31)) : '';

  let mm = 0,
      mi = sample.indexOf(12);
  let dd = 1,
      di = sample.indexOf(31);
  let yy = 2,
      yi = sample.indexOf(1970);

  // IE 10 or earlier, iOS 9 or earlier, non-Latin numbering system
  // or non-Gregorian calendar; fall back to mm/dd/yyyy
  if (yi >= 0 && mi >= 0 && di >= 0) {
    mm = (mi > yi) + (mi > di);
    dd = (di > yi) + (di > mi);
    yy = (yi > mi) + (yi > di);
  }

  let r = [];
  r[yy] = 'yyyy';
  r[mm] = 'mm';
  r[dd] = 'dd';

  return r.join(sample.match(/[-.]/) || '/');
}

console.log(dateFormat());     // 'mm/dd/yyyy' if in US
console.log(dateFormat('de')); // 'dd.mm.yyyy'

答案 2 :(得分:0)

您可以使用以下代码段确定浏览器使用的日期格式。

var format = "DD/MM/YYYY"; 
if(new Date("21/5/2019")=="Invalid Date"){
    format = "MM/DD/YYYY"; //if 21/5/2019 is invalid, format should be "MM/DD/YYYY"
}

然后您可以使用format变量相应地建立日期

说明

如果浏览器使用"MM/DD/YYYY"格式,则new Date("21/5/2019")将被解析为“无效日期”。如果未将其解析为“无效日期”,则浏览器应使用"DD/MM/YYYY"格式

答案 3 :(得分:0)

您也可以不花时间来做到这一点

getDateFormatString() {
    const formatObj = new Intl.DateTimeFormat(locale).formatToParts(new Date());

    return formatObj
      .map(obj => {
        switch (obj.type) {
          case "day":
            return "DD";
          case "month":
            return "MM";
          case "year":
            return "YYYY";
          default:
            return obj.value;
        }
      })
      .join("");
  }

// locale="en-US" 
getDateFormatString(); // MM/DD/YYYY
// locale="en-GB"
getDateFormatString(); // DD/MM/YYYY

答案 4 :(得分:-1)

您可以将options参数传递给toLocaleDateString以获取所需的日期。

&#13;
&#13;
var date = new Date();
var options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
console.log(date.toLocaleDateString('en',options));
&#13;
&#13;
&#13;