【问题标题】:Get system date format using Angular js使用Angular js获取系统日期格式
【发布时间】:2016-10-12 11:46:42
【问题描述】:

我想使用 Angular js 获取系统日期格式。用户可能已将其选择为 dd/mm/YYYY、dd/mm/yy ... 等等,它可以是用户在他/她的计算机上选择的任何日期格式。是否可以获取日期格式?

--编辑--

我没有像 2016 年 10 月 12 日、2016 年 12 月 10 日这样的日期值...等等,我还需要从用户系统中选择与用户选择的格式相同的日期值。

【问题讨论】:

  • AFAIK,浏览器不提供相关信息
  • 我有一些资源here 但我不清楚如何使用它。谢谢。
  • stackoverflow.com/questions/673905/… 可能会有所帮助。
  • 这感觉像是一个 XY 问题。 xyproblem.info。您想做一些未知的事情 (X),并相信获取系统日期格式 (Y) 会解决您的问题。您在询问 Y,但不清楚为什么首先需要解决 Y,因为 Y 并不是任何问题的真正通用解决方案。
  • “从用户系统中挑选”是什么意思?你似乎很困惑。如果您在 HTML 中显示 date 选择器,您的 JavaScript 会将其读取为 Date 对象,这不是特定于语言环境的。 (自 1970 年 1 月 1 日 00:00:00 以来的毫秒数)。您可以在客户端或服务器上使用它,它总是会正确输出。我再次问,您要解决的实际问题是什么?

标签: javascript angularjs date


【解决方案1】:

我认为您无法仅使用 Javascript 找出他/她的计算机日期格式。如果您在后端使用某种动态语言,您应该尝试以这种方式检索时间格式。

【讨论】:

  • 正确的建议,但不是答案。 :-(
  • 你能告诉我你在后端使用什么语言吗?因为主要取决于语言,所以我可以帮助你。
  • 另外,当我从事某个项目时,我想起了一些事情。我在 AngularJS 中使用过 HTML5,如果我没记错的话,HTML5 确实格式化了我的日期输入,就像它在我的系统上一样。所以不要为此烦恼,每个用户都会有不同的日期视图。尝试更改系统上的日期和时间格式,然后再次运行应用程序,看看会发生什么。
【解决方案2】:

我认为您可以查看 Mozilla MDN,但我相信 JS 无法获取此信息,因为 JS 依赖于浏览器 API。因此,如果浏览器 API 提供了该功能,则可以使用任何框架,例如 .Net 或 Java 等。

【讨论】:

    【解决方案3】:

    不是一个完整的解决方案,但可以用作参考,您可以添加对新格式的支持。

    逻辑

    • 为每年都会存在的特定日期创建一个日期对象。喜欢:2016 年 12 月 31 日
    • 现在搜索第一个非字母数字字符。这是您的分隔符。
    • 现在您有 3 个部分,您可以通过将值与 31 进行比较轻松找到 dd
    • 偶数部分很简单,因为它可以有两个值,162016
    • 一个月可能很棘手。它可以有12DecDecember。为此,您可以进行 2 次检查。如果数字等于 12,则为mm。如果不是数字且长度为 3,则为 mmm 否则为 mmmm

    现在您可以创建var d = new Date('2016/12/31') 并将d.toLocaleDateString() 传递给下面的函数。

    function getDateFormat(dateStr) {
      var delimiter = dateStr.match(/[^0-9a-z]/i)[0];
      var dateParts = dateStr.split(delimiter);
      var r = dateParts.map(function(d, i) {
        if (d == 31) {
          return "dd"
        } else if (!isNaN(d) && (d == 2016 || (d + 2000) == 2016)) {
          return d.toString().length === 4 ? "YYYY" : "yy"
        } else if (d == 12) {
          return "mm"
        } else if (isNaN(d)) {
          var _t = d.replace(/[^a-z]/gi, '')
          return _t.length === 3 ? "mmm" : "mmmm"
        }
      });
      return r.join(delimiter);
    }
    
    Date.prototype.getSystemDateFormat = function(){
      return getDateFormat(new Date('2016/12/31').toLocaleDateString());
    }
    //or
    Date.prototype.SYSTEM_FORMAT = (function(){
      return getDateFormat(new Date('2016/12/31').toLocaleDateString());
    })()
    
    console.log(new Date().getSystemDateFormat())
    console.log(new Date().SYSTEM_FORMAT)
    
    var d1 = "12/31/2016"
    console.log(getDateFormat(d1))
    
    d1 = "31/12/2016"
    console.log(getDateFormat(d1))
    
    d1 = "31 December 2016"
    console.log(getDateFormat(d1))
    
    d1 = "31 Dec. 2016"
    console.log(getDateFormat(d1))
    
    d1 = "31-12-2016"
    console.log(getDateFormat(d1))
    
    d1 = "31.12.2016"
    console.log(getDateFormat(d1))

    也可以在date.prototype中添加函数直接获取值,而不是每次都调用,

    Date.prototype.getSystemDateFormat = function(){
      return getDateFormat(new Date('2016/12/31').toLocaleDateString());
    }
    //or
    Date.prototype.SYSTEM_FORMAT = (function(){
      return getDateFormat(new Date('2016/12/31').toLocaleDateString());
    })()
    

    编辑 1

    正如@RobG 正确指出的那样,date.toLocaleStringdate.toLocaleDateString 在所有浏览器中并不统一。

    【讨论】:

    • 这很有帮助,但我的挑战是我什至没有 d1、d2、d3 的值......那该怎么办?
    • 对不起。我后来添加了那部分。你必须创建一个虚拟日期var d = new Date('2016/12/31') 然后getDateFormat(d.toLocaledateString()) 这应该给你必要的价值
    • 有没有办法从用户的系统中获取这个虚拟日期?而不是手动输入。
    • 我希望,但我不知道。正如其他答案已经指定的那样,默认情况下没有 JS 的 API 来获取它。虽然我添加了可以减少负载的原型函数。
    • 老兄,您不必将其设置为任何 HTML 元素。这是初始化的一部分。您可以对某些值进行硬编码,因为您的代码取决于其输出。
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多