Angular: фильтр даты добавляет часовой пояс, как выводить UTC?

Я использую фильтр даты для рендеринга отметки времени unix в определенном формате. Я заметил, что фильтр добавляет локальный часовой пояс к выходу.

Можно ли просто вывести точную метку времени без добавления информации о часовом поясе?

Input:

talk.content.date_and_time = 1400167800 

(05/15/14 @3:30:00 pm UTC)

код:

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

Вывод:

15-5-2014 17:30 +0200

Как я могу сделать вывод 15:30 вместо 17:30?

Ответ 1

"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="[email protected]*" 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, чтобы играть с ним

См. также this и .

Также обратите внимание, что с помощью этого метода, если вы используете фильтр даты "Z" из Angular, кажется, он все равно напечатает ваше местное смещение часового пояса.

Ответ 2

Так как версия 1.3.0 AngularJS ввела дополнительный параметр фильтра 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' }}

Здесь вы можете найти документацию по фильтрам даты AngularJS.

ПРИМЕЧАНИЕ: работает только с Angular 1.x

Здесь рабочий пример

Ответ 3

Фильтр даты всегда форматирует даты, используя локальный часовой пояс. Вам нужно будет написать свой собственный фильтр на основе методов getUTCXxx() Date или в библиотеке, например moment.js.

Ответ 4

Я просто использовал функцию getLocaleString() для своего приложения. Он должен адаптировать формат времени, общий для локали, поэтому нет +0200 и т.д. Конечно, будет меньше возможностей для управления шириной вашей строки.

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