有没有办法在JavaScript中获取系统短日期格式?
例如,系统的短日期格式是美国格式,如m/d/Y还是欧洲格式,如d/m/Y。
请注意: 这不是关于格式化日期或基于地理位置计算日期的问题,而是关于从操作系统/系统获取格式的问题。
有没有办法在JavaScript中获取系统短日期格式?
例如,系统的短日期格式是美国格式,如m/d/Y还是欧洲格式,如d/m/Y。
请注意: 这不是关于格式化日期或基于地理位置计算日期的问题,而是关于从操作系统/系统获取格式的问题。
经过一番研究,我得出结论,从技术上讲,获取区域设置(包括日期格式)是不可能的,但您可以选择以下几个选项之一:
a)使用已经提到但过时的“toLocaleString()”函数:
var myDate = new Date(1950, 01, 21, 22, 23, 24, 225);
var myDateFormat = myDate.toLocaleString();
alert (myDateFormat);
问题:
1)你无法使用“myDateFormat.replace”获取日期掩码,因为月份不是以“01”,“02”等数字形式存储在字符串中, 而是根据区域设置以文本形式存储(例如英语中的“February”,但在希腊语中为“Φεβρουάριος”,而在克林贡语中则是谁知道)。
2)在不同的浏览器中有不同的行为
3)在不同的操作系统和浏览器版本上有不同的行为...
b)使用toISOString()
函数代替toLocaleString()
。您将得到一个日期,从中可以确定日期的哪个部分(即该字符串中的“月份”或“日期”在哪里)。您也可以使用getUTCDate()
、getUTCMonth()
和getUTCDay()
函数进行操作。您仍然无法确定客户端使用的日期格式,但可以确定您在抓取日期时要使用哪个年/月/日等;使用上述代码测试我在此处提到的函数以了解您可以期望什么。
c)阅读不同浏览器中toLocaleString()的不一致行为文章,并使用在其中描述的(依我之见很棒的)解决方案
对于我的情况,我使用了一个自定义日期,我知道哪一天是几号,哪个月份,哪一年,因此可以通过简单的替换语句实现。
let customDate = new Date(2222, 11, 18);
let strDate = customDate.toLocaleDateString();
let format = strDate
.replace("12", "MM")
.replace("18", "DD")
.replace("2222", "yyyy");
这里可以找到一个非常好但有点长的答案:https://dev59.com/onE95IYBdhLWcg3wQ7qc#9893752
这里有一个更短的答案:
let customDate = new Date(2222, 3, 8);
let strDate = customDate.toLocaleDateString();
let format = strDate
.replace("04", "MM")
.replace("4", "M")
.replace("08", "dd")
.replace("8", "d")
.replace("2222", "yyyy")
.replace("22", "yy");
console.log(format);
我们创建一个已知日期的日期对象,然后解析结果。
首先,我们查找"04"
(对应于日期定义中的3
),这将是两位数月份格式MM
。如果未找到,则必须为单个数字格式M
。之后对日和年做同样的操作。
它应该能完成工作...
function getSystemDateLocale(){
let testDate = (new Date('2000-1-30')).toLocaleDateString()
if (testDate.substring(0,2) == '30') return 'EU'
else return 'US'
}
这是不可能的。您可以从用户浏览器获取文化信息,并使用一些JS库将其转换为正确的日期格式。http://code.google.com/p/datejs/
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;
}
首先尝试将用户浏览器的日期转换为美国格式(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"; // 例如,输入使用欧洲格式(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;
}
.toLocaleDateString()
格式化已知日期,然后测试结果字符串是否以月份开头来解决它。 - nnnnnn