2013-12-18 4 views
65

У меня есть дата UTC в миллисекундах, которую я перехожу на фильтр даты Угловая для форматирования человека.Использование фильтра даты в формате AngularJS с датой UTC

{{someDate | date:'d MMMM yyyy'}} 

Awesome, за исключением someDate в UTC и дата фильтра считает это местное время.

Как я могу определить Угловое, что someDate - UTC?

спасибо.

+0

* дата * фильтр преобразует его в местное время автоматически. – zsong

+4

Он не знает, что дата UTC, поэтому преобразование неверно. – Francisc

+0

@see http://stackoverflow.com/questions/20470139/angularjs-timestamp-to-formatted-utc-time-with-date-helper –

ответ

50

Похожие Вопрос here

Я перепечатывать свой ответ и предложить слияние:

Выход UTC, кажется, предметом некоторой путаницы - люди, кажется, тяготеет к moment.js.

Заимствования из этого answer, вы могли бы сделать что-то вроде этого (т.е. использовать функцию преобразования, которая создает дату в конструкторе UTC) без 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 и this.

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

3

Если вы используете moment.js вы бы использовать момент(). Функция (UTC) для преобразования объекта момент в UTC. Вы можете также обрабатывать хороший формат внутри контроллера вместо представления, используя функцию moment(). Format(). Например:

moment(myDate).utc().format('MM/DD/YYYY') 
+0

Он не хочет преобразовывать его в UTC, так как он уже находится в UTC. Вы должны использовать его следующим образом: 'moment(). Utc (myDate) .format ('MM/DD/YYYY')' – nir

87

Кажется, что люди AngularJS работают над ним в версии 1.3.0. Все, что вам нужно сделать, это добавить : 'UTC' после строки формата. Что-то вроде:

{{someDate | date:'d MMMM yyyy' : 'UTC'}} 

Как вы можете видеть в docs, вы также можете играть с ним здесь: Plunker example

Кстати, я думаю, что есть ошибка с параметром Z, так как она до сих пор показывает местной часовой пояс даже с «UTC».

+6

Я думаю, что PO хочет отформатировать дату UTC в строку локального формата, напротив. – tedyyu

+1

К сожалению, этот дополнительный параметр часового пояса не поддерживается в [Дате трубы Углового 2] (https://angular.io/docs/ts/latest/api/common/index/DatePipe-class.html). Выполнение чего-то вроде того, что предлагается в первом ответе, по-прежнему будет работать в Angular 2. – munsellj

+0

Hi @nir Это работает для меня.вопрос: каким-либо образом я могу получить имена Месяца на испанском языке, как это указано выше. поэтому были установлены имена месяца, такие как январь, февраль, март ... и т. д. Мне нужно сделать их такими: enero, febrero, marzo? Любые указатели помогут. – Nirmal

10

Вот filter, который примет строку даты ИЛИ объект Date() javascript.Он использует Moment.js и может применить любой Moment.js функцию преобразования, такие как популярный '' fromNow

angular.module('myModule').filter('moment', function() { 
    return function (input, momentFn /*, param1, param2, ...param n */) { 
    var args = Array.prototype.slice.call(arguments, 2), 
     momentObj = moment(input); 
    return momentObj[momentFn].apply(momentObj, args); 
    }; 
}); 

Итак ...

{{ anyDateObjectOrString | moment: 'format': 'MMM DD, YYYY' }} 

будет отображать 11 ноября 2014

{{ anyDateObjectOrString | moment: 'fromNow' }} 

будет отображать 10 минут назад

Если вам нужно вызвать несколько функций момента, вы можете их связать. Это превращается в UTC, а затем форматирует ...

{{ someDate | moment: 'utc' | moment: 'format': 'MMM DD, YYYY' }} 
3

усовершенствованным версия ossek раствора

Пользовательский фильтр больше подходит, то вы можете использовать его в любом месте в проекте

JS файл

var myApp = angular.module('myApp',[]); 

myApp.filter('utcdate', ['$filter','$locale', function($filter, $locale){ 

    return function (input, format) { 
     if (!angular.isDefined(format)) { 
      format = $locale['DATETIME_FORMATS']['medium']; 
     } 

     var date = new Date(input); 
     var d = new Date() 
     var _utc = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); 
     return $filter('date')(_utc, format) 
    }; 

}]); 

в шаблон

<p>This will convert UTC time to local time<p> 
<span>{{dateTimeInUTC | utcdate :'MMM d, y h:mm:ss a'}}</span> 
+0

Это на самом деле неправильно, потому что он больше не использует функции UTC даты - вопреки сценарию ossek. он работал бы, хотя, если дата в 'input' включала строку« UTC »в конце. –

+0

Спасибо за указание. Кажется, оригинальный ответ был обновлен после моего ответа :) Я просто включил его функцию в фильтр. – Dasun

+0

пока мы на нем: могу ли я предложить использовать '$ locale ['DATETIME_FORMATS'] ['medium']' вместо фиксированного резервного формата? таким образом вы используете собственную локализацию углов. Ваш формат выглядит ужасно, как формат en_US, что очень редко встречается во всем мире в мире. –

0

Может работать объявляя фильтр следующим образом?

app.filter('dateUTC', function ($filter) { 

     return function (input, format) { 
      if (!angular.isDefined(format)) { 
       format = 'dd/MM/yyyy'; 
      } 

      var date = new Date(input); 

      return $filter('date')(date.toISOString().slice(0, 23), format); 

     }; 
    }); 
0

У вас также есть возможность написать специальный фильтр для вашей даты, отображающий его в формате UTC. Обратите внимание, что я использовал toUTCString().

var app = angular.module('myApp', []); 
 

 
app.controller('dateCtrl', function($scope) { 
 
    $scope.today = new Date(); 
 
}); 
 
    
 
app.filter('utcDate', function() { 
 
    return function(input) { 
 
     return input.toUTCString(); 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> 
 
    
 
<div ng-app="myApp" ng-controller="dateCtrl">  
 
    Today is {{today | utcDate}}  
 
</div>

1

После некоторых исследований я смог найти хорошее решение для преобразования UTC в местное время, есть взгляд на скрипке. Надеюсь, что это поможет

https://jsfiddle.net/way2ajay19/2kramzng/20/

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 

<div ng-app ng-controller="MyCtrl"> 
    {{date | date:'yyyy-mm-dd hh:mm:ss' }} 
</div> 


<script> 
function MyCtrl($scope) { 
$scope.d = "2017-07-21 19:47:00"; 
    $scope.d = $scope.d.replace(" ", 'T') + 'Z'; 
    $scope.date = new Date($scope.d); 
} 
</script> 
Смежные вопросы