我的页面上有一个DateTimePicker,用户在本地时区选择日期时间。但是当我们将其保存在数据库中时,我需要将其转换为UTC并保存。同样,在向用户显示时,我需要再次从UTC转换为用户的本地时区。
保存:LOCAL时区为UTC
显示:UTC到LOCAL时区
由于服务器可能驻留在其他位置,我认为在客户端本身将值转换为UTC是正确的。不确定,如果有更好的方法这样做。所以,在我的angular5页面试图同样的。
对moment.js不太熟悉,因此无法完全理解它是如何实际运作的。任何以角度更好的方式做到这一点的提示?
以下是我的成就......
convertUtcToLocalString(val : Date) : string {
var d = new Date(val); // val is in UTC
var localOffset = d.getTimezoneOffset() * 60000;
var localTime = d.getTime() - localOffset;
d.setTime(localTime);
return this.formatDate(d);
}
convertUtcToLocalDate(val : Date) : Date {
var d = new Date(val); // val is in UTC
var localOffset = d.getTimezoneOffset() * 60000;
var localTime = d.getTime() - localOffset;
d.setTime(localTime);
return d;
}
convertLocalToUtc(val : Date) : Date {
var d = new Date(val);
var localOffset = d.getTimezoneOffset() * 60000;
var utcTime = d.getTime() + localOffset;
d.setTime(utcTime);
return d;
}
感谢您的帮助。
谢谢!
答案 0 :(得分:2)
一种方法可能是在用户输入时间后仅转换为UTC一次。然后将UTC值存储在数据库中。如果要再次向客户端显示dateTime,可以使用管道内置的Angulars DatePipe ,管理从UTC转换为所需格式的逻辑。
在您的组件中,从您的服务器获取UTC日期:
import {Component, OnInit} from '@angular/core';
@Component({
selector: 'input-overview-example',
templateUrl: 'date-example.html',
})
export class DateExample implements OnInit {
public utcDate;
ngOnInit(){
//get the UTC date from your server
this.utcDate = new Date('2016-11-07T22:46:47.267');
}
}
然后使用DatePipe将模板中的UTC转换为所需的格式:
<h3>Example UTC Date pipe conversion</h3>
<div>{{utcDate| date:"MM/dd/yy"}}</div>
如果您想玩它,请查看我制作的StackBlitz演示: Live demo
答案 1 :(得分:1)
不要添加/减去偏移量。那只是选择一个不同的时刻。相反,只需调用.toISOString()
即可生成基于UTC的ISO8601格式的字符串以发送到您的服务器。您还可以将此类字符串传递给Date
对象的构造函数。将Date
对象格式化为字符串时,将发生所有到本地时间的转换。
答案 2 :(得分:1)
以ts
import { Component, OnInit } from '@angular/core';
import { utc } from 'moment';
@Component({
selector: 'input-overview-example',
templateUrl: 'date-example.html'
})
export class DateExample implements OnInit {
utcDateStr: string;
utc = utc;
ngOnInit() {
this.utcDateStr = '2016-11-07T22:46:47.267';
}
}
以html
{{ utc(utcDateStr).local().format("DD/MM/YYYY HH:MM")}}
答案 3 :(得分:0)
这是HTML控件..
<input [(ngModel)]="configDetail.effectiveDateUtc" ng2-datetime-picker [date-format]="dateFormat" ng-value="configDetail.effectiveDateUtc"
class="input" value="configDetail.effectiveDateUtc" name="EffectiveDateFrom" id="EffectiveDateFrom"
[formControl]="detailForm.controls['effectiveStartDate']" />
这是dateformat Pipe ..
从'@ angular / core'导入{Pipe,PipeTransform}; 从'@ angular / common'导入{DatePipe};
/*
* Format the given date time
* Usage:
* value | formatDateTime
* Example:
* {{ 2016-11-07T22:46:47.267 | formatDateTime }}
* formats to: date gets formatted to 11/07/2016 22:46:47
*/
@Pipe({ name: 'formatDateTime' })
export class FormatDateTimePipe implements PipeTransform {
constructor(private datePipe: DatePipe) {}
transform(updatedDate: string): string {
const format = 'MM/dd/yy h:mm:ss a';
const MIN_VALUE = new Date(0);
const dt: Date = new Date(updatedDate);
if (dt <= MIN_VALUE) {
return '';
}
const result = this.datePipe.transform(dt, format);
return result;
}
}
未成功将管道应用于控制器。网格控件很好,因为我可以写成“{{dataItem.CreatedDate | formatDateTime}}”,但不确定输入控件。
所以,现在我已经编写了一些javascript方法来执行我的功能。但是,我更愿意使用管道。
再次感谢!!
答案 4 :(得分:0)
您可以使用angular的 moment 模块。
import * as moment from "moment";
从本地到UTC:
moment(local_date).toDate();
从UTC到本地:
moment.utc(utc_date).toDate()