【问题标题】:JavaScript - Get system short date formatJavaScript - 获取系统短日期格式
【发布时间】:2013-04-19 01:41:44
【问题描述】:

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

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

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

【问题讨论】:

  • 您是在问是否可以在用户的​​屏幕右下角找到哪个?或者您是在询问用户应该根据他们的位置选择哪一个?
  • 嗨 F4r-20。是的,我的意思是默认系统的时间 - 时钟也使用它。
  • 好问题。我认为没有办法直接告诉您,但也许您可以通过使用.toLocaleDateString() 格式化已知日期然后测试结果字符串以查看它是否以月份开头来解决?
  • 看看这个帖子有没有帮助stackoverflow.com/q/2388115/276263
  • 去过那里,诅咒那个。最终在组合框中为用户提供了一个标准格式的简短列表,并在我的应用程序数据库的用户配置文件中记录了选择。浏览器对此的支持非常糟糕。

标签: javascript date datetime


【解决方案1】:

经过一番研究后,我得出结论,从技术上讲,不可能获得区域设置 - 通过这种方式,日期格式 - 但您可以做其他几件事。选择以下选项之一:
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) 阅读 Inconsistent behavior of toLocaleString() in different browser 文章并使用那里描述的(恕我直言)解决方案

【讨论】:

  • 嗨,马克,感谢您的回答。我同意你的观点,但这仍在浏览器上进行
  • 如果您的意思是选项“c”,是的,您是对的,问题被记录为浏览器问题,但解决方案更通用。另一方面,如果我是你,我会选择“b”。如果必须知道日期格式掩码,还有另一个选项:“myDateFormat.replace("1950", "yyyy");" 等 - 但对于月份,您需要找到字符串 start-end 并将该范围替换为"mm" - 这使您的脚本有点过于复杂,甚至可能达到您的目标......
  • 唯一的问题是,例如,如果我的系统时钟、Excel 电子表格和一大堆其他应用程序正在使用 d/m/Y 并且我的浏览器会出于某种原因检测到“en-US”(是的它会这样做)它将使用 en-US 格式,即 m/d/Y
  • 我明白了。但是 javascript 变通办法的问题是区域设置在每个和所有系统上都是唯一的,因为用户可以根据需要自定义显示的日期/时间格式。例如。我的电脑有 en-US 语言环境(我喜欢设置这个,因为我使用带 EN 键盘的 EN OS),但我将日期/时间格式设置为匈牙利语(“yyyy.mm.dd,DDDD”和“HH:mm:ss”)因为我是匈牙利人。而且这种格式不是匈牙利标准。我就是喜欢这样......这就是为什么“不”是你问题的答案。编写一个在所有系统上都能完美运行的脚本来“提取”日期格式是不可能的
  • 附带说明,空输入 type=time 显示的格式与系统中配置的格式完全相同,但我还没有找到从 JavaScript 中检索它的方法
【解决方案2】:

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

let customDate = new Date(2222, 11, 18);
let strDate = customDate.toLocaleDateString();
let format = strDate
    .replace("12", "MM")
    .replace("18", "DD")
    .replace("2222", "yyyy");

【讨论】:

  • 使用这种方法,您可能会错误地使用"dd" 而不是"d"
  • "mm" 是分钟而不是月份的占位符!
【解决方案3】:

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

【讨论】:

  • 请看我的问题的注释
  • 答案是否定的。不可能只是给你一些提示。 :)
【解决方案4】:

我做了一个函数来确定客户日期格式。函数确定 日期格式分隔符,也决定了第 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;
}

【讨论】:

    【解决方案5】:

    我创建了一个解决方法来确定用户的浏览器正在使用哪种格式。 这是在 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;
        }
    

    【讨论】:

      【解决方案6】:

      可以在这里找到一个非常好的但冗长的答案: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。之后对日和年执行相同的操作。

      【讨论】:

        【解决方案7】:

        它应该做的工作......

        function getSystemDateLocale(){
            let testDate = (new Date('2000-1-30')).toLocaleDateString()
            if (testDate.substring(0,2) == '30') return 'EU'
            else return 'US'
        }
        

        【讨论】:

          【解决方案8】:

          使用 Date.CultureInfo.formatPatterns.shortDate

          【讨论】:

          • 嗨。刚检查过。你从哪里获得 CultureInfo 的? Firefox 和 Chrome 中的 Date 对象没有
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多