4

有没有办法使日期管道动态化,以便如果它是美国浏览器,日期管道返回美国格式(yyyy/MM/dd),而当它是欧洲浏览器时,它返回欧洲格式(dd/MM/yyyy)?

谢谢

4

4 回答 4

4

这可能很难,尤其是在使用 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);
  }
}

窗户:

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 {}
  }
}
于 2017-08-08T07:26:26.407 回答
2

我认为你应该使用原生 JS APIDate.prototype.toLocaleDateString()来实现这个目标。请参阅此链接

您可以实现自己的 Angular 管道以使用此 API。

于 2018-06-14T04:11:28.553 回答
0

我知道这可能看起来很讨厌,但它比乞求 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>

或者更好的是,让它成为一个管道。

于 2019-10-14T10:18:44.770 回答
0

您可以检查位置并将其放入 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());
  });

}

于 2017-08-08T07:13:57.523 回答