Angular 2 Datepipe форматирование в зависимости от местоположения / настроек браузера

Есть ли способ сделать динамическую дату-пайп такой, чтобы, если это американский браузер, датапайп возвращал американский формат (гггг / мм / дд), а когда это европейский браузер, он возвращал европейский формат (дд / мм / гггг)?

Спасибо

3 ответа

Решение

Это может быть сложно, особенно при использовании aot. Обычно требуется, чтобы вы делали разные сборки. Я расширил данные и использую локали браузера.

Datepipe:

@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 {}
  }
}

Я думаю, что вы должны использовать нативный JS API Date.prototype.toLocaleDateString() для достижения этой цели. Смотрите эту ссылку.

Вы можете реализовать свой собственный Angular pipe для использования этого API.

Вы можете проверить местоположение и вставить его, если утверждение Да, вы можете использовать трубу следующим образом:

     <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());
  });

}

Я знаю, что это может показаться неприятным, но это намного проще, чем просить 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>

А еще лучше, сделайте из нее трубку.

Другие вопросы по тегам