16

有没有办法在 JavaScript 中获取系统短日期格式?

例如系统的短日期是否为美国格式,例如。m/d/Y 或在欧洲,例如。d/m/Y

请注意: 这不是关于格式化日期或根据地理位置计算日期的问题,而是关于从操作系统/系统获取格式的问题

4

8 回答 8

5

经过一番研究后,我得出结论,从技术上讲,不可能获得区域设置——通过这种方式,日期格式——但你可以做其他几件事。选择以下选项之一:
a) 已经提到且已过时的“toLocaleString()”函数:

var myDate = new Date(1950, 01, 21, 22, 23, 24, 225);
var myDateFormat = myDate.toLocaleString();
alert (myDateFormat);

问题:
1)您不能“myDateFormat.replace”来获取日期掩码,因为月份不是在字符串中存储为“01”、“02”等,而是作为文本存储,基于语言环境(如“二月”在英语,但它在希腊语中是“Φεβρουάριος”,谁知道在例如克林贡语中是什么)。
2) 不同浏览器上的不同
行为 3) 不同操作系统和浏览器版本上的不同行为...

b) 使用toISOString()函数而不是toLocaleString(). 您不会获得区域设置日期掩码,但会获得一个日期,您可以从中知道日期的哪一部分(即“月”或“日”在该字符串中的位置)。您还可以使用getUTCDate(),getUTCMonth()getUTCDay()函数。您仍然无法分辨客户使用的日期格式,但是当你约会时可以知道你在哪个年/月/日/等处工作;使用code上面测试我在这里提到的功能,看看你能期待什么。

c) 在不同的浏览器文章中阅读 toLocaleString() 的不一致行为,并使用那里描述的(恕我直言)解决方案

于 2013-04-25T09:22:21.897 回答
2

对于我的情况,我使用了一个自定义日期,我知道什么是日期,什么是月份,什么是年份,因此可以通过简单的替换语句来实现。

let customDate = new Date(2222, 11, 18);
let strDate = customDate.toLocaleDateString();
let format = strDate
    .replace("12", "MM")
    .replace("18", "DD")
    .replace("2222", "yyyy");
于 2020-03-22T15:56:45.320 回答
0

这不可能。您可以从用户浏览器获取文化并使用一些 js 库转换为正确的日期格式。http://code.google.com/p/datejs/

于 2013-04-25T08:54:21.493 回答
0

我做了一个函数来确定客户日期格式。该函数确定日期格式分隔符,还确定日期格式的第 1、第 2 和第 3 部分。

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;
}
于 2019-07-12T18:38:17.507 回答
0

它应该做的工作...

function getSystemDateLocale(){
    let testDate = (new Date('2000-1-30')).toLocaleDateString()
    if (testDate.substring(0,2) == '30') return 'EU'
    else return 'US'
}
于 2022-01-16T05:13:26.807 回答
0

我创建了一个解决方法来确定用户的浏览器正在使用哪种格式。这是在 C# 中,但逻辑是相同的:

以下是步骤:

  1. 首先尝试将用户的浏览器日期转换为美国格式(mm-dd-yyyy)。Convert.ToDateTime 使用美国日期格式。

  2. 如果失败,则意味着用户正在使用欧洲格式 (dd-mm-yyyy)。但是,这将仅涵盖第 13 天到第 31 天,因为这不是一个有效的月份。

  3. 如果转换成功,则再次检查转换日期是否介于当前 UTC 天 + 1 天(覆盖 UTC+14)和当前 UTC 天 - 1 天(覆盖 UTC-12)之间。 https://www.timeanddate.com/time/current-number-time-zones.html

  4. 如果转换后的日期超出当前日期范围,则表示用户的浏览器使用的是欧洲格式(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;
    }
于 2020-10-23T10:06:09.723 回答
0

在这里可以找到一个非常好的但冗长的答案:https ://stackoverflow.com/a/9893752/2484903

这里有一个较短的:

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。之后对日和年做同样的事情。

于 2021-09-08T06:00:40.287 回答
-1

使用 Date.CultureInfo.formatPatterns.shortDate

于 2013-11-11T20:32:56.753 回答