如何使用 javascript(格式为 dd/mm 或 mm/dd)确定用户区域设置日期格式?
How to determine users locale date format using javascript (format is dd/mm or mm/dd)?
我正在尝试确定用户区域设置日期格式,以便稍后可以使用它以特定格式显示日期。
我知道我可以使用 toLocaleDateString()
来获取日期格式。
假设我有 1/2/2017
。如何判断这是dd/mm
格式还是mm/dd
格式?
我尝试过的一件事是我可以从 new Date()
获取当前日期和月份,并据此进行检查(手动)。当日期为2/2/2016
或3/3/2016
时如何判断哪个是日期哪个是月份?
有人对此问题有任何解决方案吗?
我也调查了 moment.js
。如果那里也有可用的解决方案,我将很乐意使用它。
您可以将选项参数传递给 toLocaleDateString 以根据需要获取日期。
var date = new Date();
var options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
console.log(date.toLocaleDateString('en',options));
使用 moment localeData
you can get localized longDateFormat
. This will give you localized format for year, month and day. You can use this value to 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>
此代码不适用于使用以年份开头的格式的语言环境(例如 YYYY.MM.DD.
用于匈牙利语语言环境)
为 2019 年回答这个问题。如果您真的想要彻底,您可以尝试处理低市场份额的遗留浏览器、非拉丁编号系统或非公历。
这一切都可以简化为正则表达式替换,但如果您要解析日期,则需要保留字段索引。
function dateFormat(language) {
const sample = window.Intl ? new Intl.DateTimeFormat(language, {
numberingSystem: 'latn',
calendar: 'gregory'
}).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'
console.log(dateFormat('en-AU')); // 'dd/mm/yyyy'
你也可以在不使用力矩的情况下做到这一点
function 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
我正在尝试确定用户区域设置日期格式,以便稍后可以使用它以特定格式显示日期。
我知道我可以使用 toLocaleDateString()
来获取日期格式。
假设我有 1/2/2017
。如何判断这是dd/mm
格式还是mm/dd
格式?
我尝试过的一件事是我可以从 new Date()
获取当前日期和月份,并据此进行检查(手动)。当日期为2/2/2016
或3/3/2016
时如何判断哪个是日期哪个是月份?
有人对此问题有任何解决方案吗?
我也调查了 moment.js
。如果那里也有可用的解决方案,我将很乐意使用它。
您可以将选项参数传递给 toLocaleDateString 以根据需要获取日期。
var date = new Date();
var options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
console.log(date.toLocaleDateString('en',options));
使用 moment localeData
you can get localized longDateFormat
. This will give you localized format for year, month and day. You can use this value to 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>
此代码不适用于使用以年份开头的格式的语言环境(例如 YYYY.MM.DD.
用于匈牙利语语言环境)
为 2019 年回答这个问题。如果您真的想要彻底,您可以尝试处理低市场份额的遗留浏览器、非拉丁编号系统或非公历。
这一切都可以简化为正则表达式替换,但如果您要解析日期,则需要保留字段索引。
function dateFormat(language) {
const sample = window.Intl ? new Intl.DateTimeFormat(language, {
numberingSystem: 'latn',
calendar: 'gregory'
}).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'
console.log(dateFormat('en-AU')); // 'dd/mm/yyyy'
你也可以在不使用力矩的情况下做到这一点
function 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