Angular 2 基于浏览器的日期管道格式 location/settings
Angular 2 Datepipe formatting based on browser location/settings
有没有办法让 datepipe 动态化,这样如果它是美国浏览器,datepipe returns 美国格式 (yyyy/MM/dd) 而当它是欧洲浏览器时,它 returns欧洲格式 (dd/MM/yyyy)?
谢谢
您可以检查位置并将其放在if语句中
是的,你可以像这样使用管道:
<div *ngif="Location() === 'Europe' "
{{valueDate | date: 'dd/MM/yyyy'}}
<div>
<div *ngif="Location() === 'Ammerica' "
{{valueDate | date: 'MM/dd/yyyy'}}
<div>
查找位置
getCurrentLocation(lat,lng): Observable<any> {
return this._http.get("http://maps.googleapis.com/maps/api/geocode/json?latlng="+lat+","+lng+"&sensor=true")
.map(response => response.json())
.catch(error => {
console.log(error);
return Observable.throw(error.json());
});
}
这可能很难,尤其是在使用 aot 时。它通常会要求您进行不同的构建。我扩展了数据管道并使用浏览器语言环境。
日期管道:
@Pipe({name: 'datepipe', pure: true})
export class MyDatePipe extends DatePipe implements PipeTransform {
constructor(private win: WindowRef) {
super(win.ln);
}
transform(value: any, pattern?: string): string | null {
return super.transform(value, pattern);
}
}
Window:
function _window(): any {
// return the global native browser window object
return window;
}
@Injectable()
export class WindowRef {
get nativeWindow(): any {
return _window();
}
public ln = 'en';
constructor() {
try {
if (!isNullOrUndefined(this.nativeWindow.navigator.language) && this.nativeWindow.navigator.language !== '') {
this.ln = this.nativeWindow.navigator.language;
}
}finally {}
}
}
我认为你应该使用原生 JS API Date.prototype.toLocaleDateString()
来实现这个目标。看到这个 link.
您可以实现自己的 Angular 管道来使用此 API。
我知道这可能看起来很讨厌,但它比乞求 Angular 为您做这件事要简单得多:
public renderLocaleDateTime(date: Date, dateStyle = 'medium', timeStyle = 'medium'): string {
var script = 'const date = new Date("' + date + '"); const options = { dateStyle: "' + dateStyle + '", timeStyle: "' + timeStyle + '" }; date.toLocaleString({}, options);';
return eval(script);
}
然后:
<span title="{{ renderLocaleDateTime(date, 'long', 'long') }}">
{{ renderLocaleDateTime(date) }}
</span>
或者更好,把它做成一个管道。
有没有办法让 datepipe 动态化,这样如果它是美国浏览器,datepipe returns 美国格式 (yyyy/MM/dd) 而当它是欧洲浏览器时,它 returns欧洲格式 (dd/MM/yyyy)?
谢谢
您可以检查位置并将其放在if语句中 是的,你可以像这样使用管道:
<div *ngif="Location() === 'Europe' "
{{valueDate | date: 'dd/MM/yyyy'}}
<div>
<div *ngif="Location() === 'Ammerica' "
{{valueDate | date: 'MM/dd/yyyy'}}
<div>
查找位置
getCurrentLocation(lat,lng): Observable<any> {
return this._http.get("http://maps.googleapis.com/maps/api/geocode/json?latlng="+lat+","+lng+"&sensor=true")
.map(response => response.json())
.catch(error => {
console.log(error);
return Observable.throw(error.json());
});
}
这可能很难,尤其是在使用 aot 时。它通常会要求您进行不同的构建。我扩展了数据管道并使用浏览器语言环境。
日期管道:
@Pipe({name: 'datepipe', pure: true})
export class MyDatePipe extends DatePipe implements PipeTransform {
constructor(private win: WindowRef) {
super(win.ln);
}
transform(value: any, pattern?: string): string | null {
return super.transform(value, pattern);
}
}
Window:
function _window(): any {
// return the global native browser window object
return window;
}
@Injectable()
export class WindowRef {
get nativeWindow(): any {
return _window();
}
public ln = 'en';
constructor() {
try {
if (!isNullOrUndefined(this.nativeWindow.navigator.language) && this.nativeWindow.navigator.language !== '') {
this.ln = this.nativeWindow.navigator.language;
}
}finally {}
}
}
我认为你应该使用原生 JS API Date.prototype.toLocaleDateString()
来实现这个目标。看到这个 link.
您可以实现自己的 Angular 管道来使用此 API。
我知道这可能看起来很讨厌,但它比乞求 Angular 为您做这件事要简单得多:
public renderLocaleDateTime(date: Date, dateStyle = 'medium', timeStyle = 'medium'): string {
var script = 'const date = new Date("' + date + '"); const options = { dateStyle: "' + dateStyle + '", timeStyle: "' + timeStyle + '" }; date.toLocaleString({}, options);';
return eval(script);
}
然后:
<span title="{{ renderLocaleDateTime(date, 'long', 'long') }}">
{{ renderLocaleDateTime(date) }}
</span>
或者更好,把它做成一个管道。