有没有办法在JavaScript中获取系统短日期格式?
例如,系统的短日期是否采用美国格式,例如。 m / d / Y或欧洲,例如d /米/ Y
请注意: 这不是关于格式化日期或基于地理位置计算日期的问题,而是关于从OS /系统获取格式的问题
答案 0 :(得分:4)
经过一番研究后,我得出结论,从技术上来说,不可能获得区域设置 - 以及日期格式 - 但你可以做其他几件事。选择以下选项之一:
a)已经提到的 - 和过时的 - “toLocaleString()”函数:
var myDate = new Date(1950, 01, 21, 22, 23, 24, 225);
var myDateFormat = myDate.toLocaleString();
alert (myDateFormat);
问题:
1)您不能通过“myDateFormat.replace”来获取日期掩码,因为月份不会在字符串中存储为“01”,“02”等,而是作为文本而不是基于locale(如英语中的“February”,但是希腊语中的“Φεβρουάριος”,并且知道例如Klingon中的内容。)2)不同浏览器上的不同行为
3)不同操作系统和浏览器版本的不同行为。 ..
b)使用toISOString()
函数代替toLocaleString()
。您不会获得区域设置日期掩码,但会获得一个日期,您可以从该日期告知日期的哪个部分(即“月”或“日”在该字符串中的位置)。您还可以使用getUTCDate()
,getUTCMonth()
和getUTCDay()
函数。您仍然无法判断客户端使用的日期格式,但可以告诉您在获取日期时使用哪个年/月/日/等;使用上面的code
测试我在这里提到的功能,看看你能期待什么。
c)阅读
Inconsistent behavior of toLocaleString() in different browser文章并使用那里描述的(恕我直言)伟大的解决方案
答案 1 :(得分:0)
这是不可能的。您可以从用户浏览器获取文化并使用一些js库转换为正确的日期格式。 http://code.google.com/p/datejs/
答案 2 :(得分:0)
我做了一个确定客户日期格式的函数。功能确定 日期格式分隔符,并确定日期的第一,第二和第三部分 日期格式。
getDateFormat(){
// initialize date value "31st January 2019"
var my_date = new Date(2019,0,31);
console.log(my_date.toLocaleDateString());
// Initialize variables
var separator="";
var first="";
var second="";
var third="";
var date_parts = [];
// get separator : "-", "/" or " ", format based on toLocaleDateString function
if (my_date.toLocaleDateString().split("-").length==3){
separator = " - ";
date_parts = my_date.toLocaleDateString().split("-");
}
if (my_date.toLocaleDateString().split("/").length == 3) {
separator = " / ";
date_parts = my_date.toLocaleDateString().split("/");
}
if (my_date.toLocaleDateString().split(" ").length == 3) {
separator = " ";
date_parts = my_date.toLocaleDateString().split(" ");
}
// get first part
if (date_parts[0]==2019){
first ="yyyy";
} else if (date_parts[0] == 31){
first = "dd";
} else{
if (date_parts[0].length<=2){
first ="mm";
}
else{
first="mmm";
}
}
// get second part
if (date_parts[1] == 2019) {
second = "yyyy";
} else if (date_parts[1] == 31) {
second = "dd";
} else {
if (date_parts[1].length <= 2) {
second = "mm";
}
else {
second = "mmm";
}
}
// get third part
if (date_parts[2] == 2019) {
third = "yyyy";
} else if (date_parts[2] == 31) {
third = "dd";
} else {
if (date_parts[2].length <= 2) {
third = "mm";
}
else {
third = "mmm";
}
}
// assembly
var format = first + separator + second + separator + third;
console.log(format);
return format;
}
答案 3 :(得分:0)
对于我来说,我使用了一个自定义日期,我知道什么数字是天,什么月和什么年,因此可以通过简单的replace语句来实现。
let customDate = new Date(2222, 11, 18);
let strDate = customDate.toLocaleDateString();
let format = strDate
.replace("12", "mm")
.replace("18", "dd")
.replace("2222", "yyyy");
答案 4 :(得分:0)
我创建了一个变通办法来确定用户浏览器使用的是哪种格式。 这在C#中,但是逻辑是相同的:
以下是步骤:
首先尝试将用户的浏览器日期转换为美国格式(mm-dd-yyyy)。 Convert.ToDateTime使用美国日期格式。
如果失败,则表示用户使用的是欧洲格式(dd-mm-yyyy)。 但是,这将仅涵盖第13到31天,因为这不是有效月份。
如果转换成功,请执行另一项检查以确定转换日期是否在当前UTC天+ 1天(以覆盖UTC + 14)和当前UTC天-1天(以覆盖UTC-12)之间)。 https://www.timeanddate.com/time/current-number-time-zones.html
如果转换后的日期超出当前日期范围,则表示用户的浏览器使用的是欧洲格式(dd-mm-yyyy),并且可以根据需要将其转换为美国格式。
string localeDateString = "01/11/2020"; // e.g. input is using European format (dd-mm-yyyy)
var localeDate = new DateTime();
try
{
localeDate = Convert.ToDateTime(localeDateString);
//var checkTheFormatOfDateInput = localeDate.ToLongDateString();
var currentDateTime = DateTime.UtcNow;
//var currentDateTime = Convert.ToDateTime("11/01/2020");
//var checkTheFormatOfCurrentDate = Convert.ToDateTime("11/01/2020").ToLongDateString();
var currentDateTimePositive = currentDateTime.AddDays(1);
var currentDateTimeNegative = currentDateTime.AddDays(-1);
var outOfCurrentDateRange = !(localeDate.Ticks > currentDateTimeNegative.Ticks && localeDate.Ticks < currentDateTimePositive.Ticks);
if (outOfCurrentDateRange)
{
localeDate = DateTime.ParseExact(localeDateString, "dd/MM/yyyy", CultureInfo.InvariantCulture);
}
}
catch
{
localeDate = DateTime.ParseExact(localeDateString, "dd/MM/yyyy", CultureInfo.InvariantCulture);
}
//var checkTheEndResultFormat = localeDate.ToLongDateString();
下面是包装在方法中的干净代码:
private DateTime ConvertAmericanOrEuropeanDateFormatToAmericanDateFormat(string localeDateString)
{
var localeDate = new DateTime();
try
{
localeDate = Convert.ToDateTime(localeDateString);
var currentDateTime = DateTime.UtcNow;
var currentDateTimePositive = currentDateTime.AddDays(1);
var currentDateTimeNegative = currentDateTime.AddDays(-1);
var outOfCurrentDateRange = !(localeDate.Ticks > currentDateTimeNegative.Ticks && localeDate.Ticks < currentDateTimePositive.Ticks);
if (outOfCurrentDateRange)
{
localeDate = DateTime.ParseExact(localeDateString, "dd/MM/yyyy", CultureInfo.InvariantCulture);
}
}
catch
{
localeDate = DateTime.ParseExact(localeDateString, "dd/MM/yyyy", CultureInfo.InvariantCulture);
}
return localeDate;
}
答案 5 :(得分:-1)
使用Date.CultureInfo.formatPatterns.shortDate