@@ -5,6 +5,7 @@ import { concatMap, ReplaySubject } from 'rxjs';
55
66interface Observables extends AppModuleObservables {
77 dayTime$ : ReplaySubject < number > ;
8+ timezone$ : ReplaySubject < string | null > ;
89 speed$ : ReplaySubject < number > ;
910 paused$ : ReplaySubject < boolean > ;
1011}
@@ -15,6 +16,7 @@ interface State extends AppModuleState {
1516 auto : boolean ;
1617 dayTime : number ;
1718 speed : number ;
19+ timezone : string | null ;
1820}
1921
2022const DAY_LENGTH_SECONDS = 24 * 60 * 60 ; // 5 Minuten
@@ -27,13 +29,15 @@ export default class TimeAppModule extends AppModule<State, Observables> {
2729 auto : true ,
2830 dayLengthSeconds : DAY_LENGTH_SECONDS ,
2931 dayTime : 0 ,
30- speed : 1
32+ speed : 1 ,
33+ timezone : null
3134 } ;
3235
3336 constructor ( app : App ) {
3437 super ( app ) ;
3538 //#region observables
3639 this . observables . dayTime$ = new ReplaySubject < number > ( 1 ) ;
40+ this . observables . timezone$ = new ReplaySubject < string | null > ( 1 ) ;
3741 this . observables . speed$ = new ReplaySubject < number > ( 1 ) ;
3842 this . observables . paused$ = new ReplaySubject < boolean > ( 1 ) ;
3943 //#endregion
@@ -45,11 +49,7 @@ export default class TimeAppModule extends AppModule<State, Observables> {
4549 . pipe ( concatMap ( this . onUpdate . bind ( this ) ) )
4650 . subscribe ( void 0 )
4751 ) ;
48- const currentDate = new Date ( ) ;
49- const hours = currentDate . getHours ( ) ;
50- const minutes = currentDate . getMinutes ( ) ;
51- const dayTime = ( hours * 60 + minutes ) / ( 24 * 60 ) ;
52- this . state . dayTime = dayTime ;
52+ this . state . dayTime = this . getTimeInTimezone ( this . state . timezone ) ;
5353 }
5454
5555 setSpeed ( speed : number ) {
@@ -92,4 +92,38 @@ export default class TimeAppModule extends AppModule<State, Observables> {
9292 this . lastTime = time ;
9393 }
9494 }
95+
96+ setTimezone ( tz : string | null ) {
97+ this . state . timezone = tz ;
98+
99+ this . state . dayTime = this . getTimeInTimezone ( tz ) ;
100+ this . observables . timezone$ . next ( this . state . timezone ) ;
101+ this . observables . dayTime$ . next ( this . state . dayTime ) ;
102+ }
103+
104+ private getTimeInTimezone ( tz : string | null ) : number {
105+ const date = new Date ( ) ;
106+
107+ let hours : number ;
108+ let minutes : number ;
109+
110+ if ( tz ) {
111+ const formatter = new Intl . DateTimeFormat ( 'en-US' , {
112+ timeZone : tz ,
113+ hour : 'numeric' ,
114+ minute : 'numeric' ,
115+ hour12 : false
116+ } ) ;
117+
118+ const parts = formatter . formatToParts ( date ) ;
119+ hours = Number ( parts . find ( p => p . type === 'hour' ) ?. value ) ;
120+ minutes = Number ( parts . find ( p => p . type === 'minute' ) ?. value ) ;
121+ } else {
122+ // local fallback
123+ hours = date . getHours ( ) ;
124+ minutes = date . getMinutes ( ) ;
125+ }
126+
127+ return ( hours * 60 + minutes ) / ( 24 * 60 ) ;
128+ }
95129}
0 commit comments