【问题标题】:Angular: date filter adds timezone, how to output UTC?Angular:日期过滤器添加时区,如何输出UTC?
【发布时间】:2014-03-14 00:32:42
【问题描述】:

我正在使用日期过滤器以某种格式呈现 unix 时间戳。我注意到过滤器将本地时区添加到输出中。

有什么方法可以简单地输出准确的时间戳,而不添加任何时区信息?

输入:

talk.content.date_and_time = 1400167800 

(UTC 时间为 05 / 15 / 14 @ 下午 3:30:00)

代码:

{{talk.content.date_and_time*1000 | date:'dd-M-yyyy H:mm Z'}}

输出:

15-5-2014 17:30 +0200

如何使输出为 15:30 而不是 17:30?

【问题讨论】:

  • 你的代码是什么?什么是输入,什么是输出?期望的输出是什么?
  • 对不起,我赶时间。添加到问题@JBNizet。
  • 如果您传递一个原始整数毫秒数,日期过滤器仍将根据本地时间对其进行解释。但是,使用 UTC 构造函数并传递日期或通过将偏移量添加到您自己的毫秒并传递它来抢占过滤器的时区偏移量并传递它似乎有效。

标签: angularjs datetime


【解决方案1】:

日期过滤器始终使用本地时区格式化日期。您必须根据DategetUTCXxx() 方法或moment.js 之类的库编写自己的过滤器。

【讨论】:

    【解决方案2】:

    “Z”是添加时区信息的部分。至于输出 UTC,这似乎是一些混乱的主题——人们似乎倾向于moment.js

    借用 answer,你可以在没有 moment.js 的情况下做这样的事情:

    控制器

    var app1 = angular.module('app1',[]);
    
    app1.controller('ctrl',['$scope',function($scope){
    
      var toUTCDate = function(date){
        var _utc = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),  date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
        return _utc;
      };
    
      var millisToUTCDate = function(millis){
        return toUTCDate(new Date(millis));
      };
    
        $scope.toUTCDate = toUTCDate;
        $scope.millisToUTCDate = millisToUTCDate;
    
      }]);
    

    模板

    <html ng-app="app1">
    
      <head>
        <script data-require="angular.js@*" data-semver="1.2.12" src="http://code.angularjs.org/1.2.12/angular.js"></script>
        <link rel="stylesheet" href="style.css" />
        <script src="script.js"></script>
      </head>
    
      <body>
        <div ng-controller="ctrl">
          <div>
          utc {{millisToUTCDate(1400167800) | date:'dd-M-yyyy H:mm'}}
          </div>
          <div>
          local {{1400167800 | date:'dd-M-yyyy H:mm'}}
          </div>
        </div>
      </body>
    
    </html>
    

    这里是plunker 玩它

    另请参阅 thisthis

    另请注意,使用此方法,如果您使用 Angular 日期过滤器中的“Z”,它似乎仍会打印您的本地时区偏移量。

    【讨论】:

    • 而不是控制器中的函数,您可以像其他人建议的那样将millisToUTCDate 合并到过滤器中。
    • 您也可以将这两个功能合二为一。 var millisToUTCDate = function(millis){ var date new Date(millis); return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }; 这对我很有帮助,因为我无法使过滤器工作:/。谢谢。
    【解决方案3】:

    由于版本1.3.0AngularJS引入了额外的过滤参数timezone,如下:

    {{ date_expression | date : format : timezone}}
    

    但在1.3.x 版本中,仅支持UTC 时区,可以如下使用:

    {{ someDate | date: 'MMM d, y H:mm:ss' : 'UTC' }}
    

    由于版本1.4.0-rc.0 AngularJS 也支持其他时区。我没有测试所有可能的时区,但这里举例说明如何以日本标准时间(JSP,GMT +9)获取日期:

    {{ clock | date: 'MMM d, y H:mm:ss' : '+0900' }}
    

    Here 你可以找到 AngularJS 日期过滤器的文档。

    注意:这仅适用于 Angular 1.x

    这里是working example

    【讨论】:

    • 遗憾的是,Angular 2's Date pipe 不支持这个额外的时区参数。执行第一个答案中建议的操作仍然适用于 Angular 2。
    • @user3640967 这仅适用于 Angular 1.x,但不适用于 Angular 2
    • 对 Angular2 做什么(UTC 的本地日期),我搜索了很多但无法得出结论,所以如果你指导我,那么我会全力以赴。
    • 对于 Angular2,您必须创建控制器或实用程序函数来将日期转换为 UTC 并返回。您可以检查接受的答案,例如如何做。
    • 也可能适用于 IANA 时区,例如 'Europe/Berlin'
    【解决方案4】:

    我刚刚为我的应用程序使用了 getLocaleString() 函数。它应该适应语言环境通用的时间格式,所以没有 +0200 等。当然,控制字符串宽度的可能性会更小。

    var str = (new Date(1400167800)).toLocaleString();
    

    【讨论】:

      猜你喜欢
      • 2014-07-22
      • 1970-01-01
      • 2016-12-09
      • 2014-01-06
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多