File

libs/core/src/lib/time/timezone.service.ts

Index

Properties
Methods

Constructor

constructor(translateSrvc: TranslateService)
Parameters :
Name Type Optional
translateSrvc TranslateService No

Methods

Private calcOffset
calcOffset()
Returns : void
Public createTzDate
createTzDate(m: moment.MomentInput)
Parameters :
Name Type Optional
m moment.MomentInput No
Returns : moment.Moment
Public formatTzDate
formatTzDate(date: moment.Moment | Date | number, format?: string)
Parameters :
Name Type Optional
date moment.Moment | Date | number No
format string Yes
Returns : string
Public getOffsetToLocaleInHours
getOffsetToLocaleInHours()
Returns : number
Public getOffsetToLocaleInMs
getOffsetToLocaleInMs()
Returns : number
Public getTimezoneName
getTimezoneName()
Returns : string
Public setTimezone
setTimezone(tzStr?: string)
Parameters :
Name Type Optional
tzStr string Yes
Returns : void

Properties

Private currentTimezone
Type : moment.MomentZone
Private offsetToLocale
Type : number
Public timezoneChange
Type : EventEmitter<string>
Default value : new EventEmitter()
import 'moment-timezone';

import { EventEmitter, Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import moment from 'moment';

@Injectable({
  providedIn: 'root'
})
export class TimezoneService {

  private currentTimezone: moment.MomentZone;

  private offsetToLocale: number; // TODO: check if still needed

  public timezoneChange: EventEmitter<string> = new EventEmitter();

  constructor(
    protected translateSrvc: TranslateService
  ) {
    this.currentTimezone = moment.tz.zone(moment.tz.guess());
    this.calcOffset();
  }

  public setTimezone(tzStr?: string) {
    const tz = moment.tz.zone(tzStr);
    if (tz) {
      this.currentTimezone = tz;
    } else {
      this.currentTimezone = moment.tz.zone(moment.tz.guess());
      console.warn(`Timezone '${tzStr}' is not supported, '${this.currentTimezone.name}' is used instead`);
    }
    this.calcOffset();
    moment.tz.setDefault(this.currentTimezone.name);
    this.timezoneChange.emit(this.currentTimezone.name);
  }

  private calcOffset() {
    const date = new Date().getTime();
    this.offsetToLocale = -1 * moment.tz.zone(moment.tz.guess()).utcOffset(date) + this.currentTimezone.utcOffset(date);
  }

  public getTimezoneName(): string {
    return this.currentTimezone.name;
  }

  public formatTzDate(date: moment.Moment | Date | number, format?: string): string {
    if (typeof (date) === 'number') { date = moment(date); }
    if (date instanceof Date) { date = moment(date); }
    if (this.translateSrvc.currentLang) { moment.locale(this.translateSrvc.currentLang); }
    if (!format) { format = 'L LT z'; }
    return date.tz(this.currentTimezone.name).format(format);
  }

  public createTzDate(m: moment.MomentInput): moment.Moment {
    return moment(m).tz(this.getTimezoneName());
  }

  public getOffsetToLocaleInMs() {
    return this.offsetToLocale * 1000 * 60;
  }

  public getOffsetToLocaleInHours() {
    return this.offsetToLocale / 60;
  }

}

result-matching ""

    No results matching ""