diff --git a/src/app/app.component.html b/src/app/app.component.html index 750e063..5b4cdcf 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,6 +1,4 @@ - -
-

{{timezone.name}}

-

{{timezone.time?.toFormat('tt')}}

-
-
\ No newline at end of file +
+

{{fiveOclock.name}}

+

{{fiveOclock.time?.toFormat('tt')}}

+
\ No newline at end of file diff --git a/src/app/app.component.scss b/src/app/app.component.scss index f853330..e19a8e0 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -8,6 +8,17 @@ padding: 0; } +.single-container { + display:flex; + align-items: center; + flex-direction: column; + justify-content: center; + height: 100%; + width: 100%; + margin: 0; + padding: 0; +} + @media (max-width: 350px) { .timezone { font-size: 1.0em; diff --git a/src/app/app.component.ts b/src/app/app.component.ts index cad37cd..d77d8bc 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,12 +1,8 @@ -import { formatDate } from '@angular/common'; import { Component } from '@angular/core'; import { interval, Observable } from 'rxjs'; -import { Timezone } from './timezone/models/timezone.model'; +import { startWith } from 'rxjs/operators'; +import { GetClosestTimezoneFrom, Timezone } from './timezone/models/timezone.model'; import { TimezoneService } from './timezone/services/timezone.service'; - - - - @Component({ selector: 'app-root', templateUrl: './app.component.html', @@ -21,16 +17,16 @@ export class AppComponent { fiveOclocks: Timezone[] = []; - constructor(private timezoneService: TimezoneService){ - this.second = interval(1000) + constructor(private timezoneService: TimezoneService) { + this.second = interval(1000).pipe(startWith(0)) //every second and give it a starter value - this.second.subscribe(()=>{ + this.second.subscribe(() => { this.fiveOclocks = []; - this.timezoneService.getCurrentTimeInTimezones(this.timezoneService.getTimezones()).forEach((timezoneObj)=>{ - if(timezoneObj.time?.hour === 17){ - this.fiveOclock = timezoneObj; + this.timezoneService.getCurrentTimeInTimezones(this.timezoneService.getTimezones()).forEach((timezoneObj) => { + if (timezoneObj.time?.hour === 17) { this.fiveOclocks.push(timezoneObj); } + this.fiveOclock = GetClosestTimezoneFrom(this.timezoneService.getCurrentTimezone(), this.fiveOclocks) }) }) diff --git a/src/app/timezone/models/timezone.model.ts b/src/app/timezone/models/timezone.model.ts index 4f759ca..c2fe7ee 100644 --- a/src/app/timezone/models/timezone.model.ts +++ b/src/app/timezone/models/timezone.model.ts @@ -2,6 +2,7 @@ import { DateTime } from 'luxon'; export interface Timezone { name: string; + location?: TimezoneLocation; time?: DateTime; } @@ -21,4 +22,470 @@ export function TimezoneCompare(a: Timezone, b: Timezone) { } return 0; +} + +// http://www.movable-type.co.uk/scripts/latlong.html +export function GetClosestTimezoneFrom(timezone: string, timezones: Timezone[]) { + var location1 = timezoneMap[timezone] + + + var closestDist = Number.MAX_SAFE_INTEGER + var closestTimezone = undefined + timezones.forEach(element => { + var location2 = timezoneMap[element.name] + + var radius = 6371; + + var deltaLat = (location2.lat - location1.lat) * (Math.PI / 180); + var deltaLong = (location2.long - location2.long) * (Math.PI / 180); + + var a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + + Math.cos(location1.lat * (Math.PI / 180)) * Math.cos(location2.lat * (Math.PI / 180)) * + Math.sin(deltaLong / 2) * Math.sin(deltaLong / 2); + + var distance = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)) * radius; + + if (distance < closestDist) { + closestDist = distance + closestTimezone = element + } + }); + return closestTimezone +} + +export function TimezoneList() { + return Object.keys(timezoneMap) +} + +export interface TimezoneLocation { + lat: number; + long: number; +} + +//TODO: This still needs to be fully populated +export var timezoneMap: { [key: string]: TimezoneLocation } = { + 'Africa/Abidjan': { lat: 5.359952, long: -4.008256 }, + 'Africa/Accra': { lat: 5.603717, long: -0.186964 }, + 'Africa/Addis_Ababa': { lat: 9.033140, long: 38.750080 }, + 'Africa/Algiers': { lat: 36.753769, long: 3.058756 }, + 'Africa/Asmara': { lat: 15.339000, long: 38.937111 }, + 'Africa/Bamako': { lat: 12.6392, long: -8.0029 }, + 'Africa/Bangui': { lat: 4.3947, long: 18.5582 }, + 'Africa/Banjul': { lat: 13.4544, long: -16.5753 }, + 'Africa/Bissau': { lat: 11.8632, long: -15.5843 }, + 'Africa/Blantyre': { lat: -15.7667, long: 35.0168 }, + 'Africa/Brazzaville': { lat: -4.2634, long: 15.2429 }, + 'Africa/Bujumbura': { lat: 0, long: 0 }, + 'Africa/Cairo': { lat: 30.0444, long: 31.2357 }, + 'Africa/Casablanca': { lat: 0, long: 0 }, + 'Africa/Ceuta': { lat: 0, long: 0 }, + 'Africa/Conakry': { lat: 0, long: 0 }, + 'Africa/Dakar': { lat: 0, long: 0 }, + 'Africa/Dar_es_Salaam': { lat: 0, long: 0 }, + 'Africa/Djibouti': { lat: 0, long: 0 }, + 'Africa/Douala': { lat: 0, long: 0 }, + 'Africa/El_Aaiun': { lat: 0, long: 0 }, + 'Africa/Freetown': { lat: 0, long: 0 }, + 'Africa/Gaborone': { lat: 0, long: 0 }, + 'Africa/Harare': { lat: 0, long: 0 }, + 'Africa/Johannesburg': { lat: 0, long: 0 }, + 'Africa/Juba': { lat: 0, long: 0 }, + 'Africa/Kampala': { lat: 0, long: 0 }, + 'Africa/Khartoum': { lat: 0, long: 0 }, + 'Africa/Kigali': { lat: 0, long: 0 }, + 'Africa/Kinshasa': { lat: 0, long: 0 }, + 'Africa/Lagos': { lat: 0, long: 0 }, + 'Africa/Libreville': { lat: 0, long: 0 }, + 'Africa/Lome': { lat: 0, long: 0 }, + 'Africa/Luanda': { lat: 0, long: 0 }, + 'Africa/Lubumbashi': { lat: 0, long: 0 }, + 'Africa/Lusaka': { lat: 0, long: 0 }, + 'Africa/Malabo': { lat: 0, long: 0 }, + 'Africa/Maputo': { lat: 0, long: 0 }, + 'Africa/Maseru': { lat: 0, long: 0 }, + 'Africa/Mbabane': { lat: 0, long: 0 }, + 'Africa/Mogadishu': { lat: 0, long: 0 }, + 'Africa/Monrovia': { lat: 0, long: 0 }, + 'Africa/Nairobi': { lat: 0, long: 0 }, + 'Africa/Ndjamena': { lat: 0, long: 0 }, + 'Africa/Niamey': { lat: 0, long: 0 }, + 'Africa/Nouakchott': { lat: 0, long: 0 }, + 'Africa/Ouagadougou': { lat: 0, long: 0 }, + 'Africa/Porto-Novo': { lat: 0, long: 0 }, + 'Africa/Sao_Tome': { lat: 0, long: 0 }, + 'Africa/Tripoli': { lat: 0, long: 0 }, + 'Africa/Tunis': { lat: 0, long: 0 }, + 'Africa/Windhoek': { lat: 0, long: 0 }, + 'America/Adak': { lat: 0, long: 0 }, + 'America/Anchorage': { lat: 0, long: 0 }, + 'America/Anguilla': { lat: 0, long: 0 }, + 'America/Antigua': { lat: 0, long: 0 }, + 'America/Araguaina': { lat: 0, long: 0 }, + 'America/Argentina/Buenos_Aires': { lat: 0, long: 0 }, + 'America/Argentina/Catamarca': { lat: 0, long: 0 }, + 'America/Argentina/Cordoba': { lat: 0, long: 0 }, + 'America/Argentina/Jujuy': { lat: 0, long: 0 }, + 'America/Argentina/La_Rioja': { lat: 0, long: 0 }, + 'America/Argentina/Mendoza': { lat: 0, long: 0 }, + 'America/Argentina/Rio_Gallegos': { lat: 0, long: 0 }, + 'America/Argentina/Salta': { lat: 0, long: 0 }, + 'America/Argentina/San_Juan': { lat: 0, long: 0 }, + 'America/Argentina/San_Luis': { lat: 0, long: 0 }, + 'America/Argentina/Tucuman': { lat: 0, long: 0 }, + 'America/Argentina/Ushuaia': { lat: 0, long: 0 }, + 'America/Aruba': { lat: 0, long: 0 }, + 'America/Asuncion': { lat: 0, long: 0 }, + 'America/Atikokan': { lat: 0, long: 0 }, + 'America/Bahia': { lat: 0, long: 0 }, + 'America/Bahia_Banderas': { lat: 0, long: 0 }, + 'America/Barbados': { lat: 0, long: 0 }, + 'America/Belem': { lat: 0, long: 0 }, + 'America/Belize': { lat: 0, long: 0 }, + 'America/Blanc-Sablon': { lat: 0, long: 0 }, + 'America/Boa_Vista': { lat: 0, long: 0 }, + 'America/Bogota': { lat: 0, long: 0 }, + 'America/Boise': { lat: 0, long: 0 }, + 'America/Cambridge_Bay': { lat: 0, long: 0 }, + 'America/Campo_Grande': { lat: 0, long: 0 }, + 'America/Cancun': { lat: 0, long: 0 }, + 'America/Caracas': { lat: 0, long: 0 }, + 'America/Cayenne': { lat: 0, long: 0 }, + 'America/Cayman': { lat: 0, long: 0 }, + 'America/Chicago': { lat: 41.8781, long: -87.6298 }, + 'America/Chihuahua': { lat: 0, long: 0 }, + 'America/Costa_Rica': { lat: 0, long: 0 }, + 'America/Creston': { lat: 0, long: 0 }, + 'America/Cuiaba': { lat: 0, long: 0 }, + 'America/Curacao': { lat: 0, long: 0 }, + 'America/Danmarkshavn': { lat: 0, long: 0 }, + 'America/Dawson': { lat: 0, long: 0 }, + 'America/Dawson_Creek': { lat: 0, long: 0 }, + 'America/Denver': { lat: 0, long: 0 }, + 'America/Detroit': { lat: 0, long: 0 }, + 'America/Dominica': { lat: 0, long: 0 }, + 'America/Edmonton': { lat: 0, long: 0 }, + 'America/Eirunepe': { lat: 0, long: 0 }, + 'America/El_Salvador': { lat: 0, long: 0 }, + 'America/Fort_Nelson': { lat: 0, long: 0 }, + 'America/Fortaleza': { lat: 0, long: 0 }, + 'America/Glace_Bay': { lat: 0, long: 0 }, + 'America/Goose_Bay': { lat: 0, long: 0 }, + 'America/Grand_Turk': { lat: 0, long: 0 }, + 'America/Grenada': { lat: 0, long: 0 }, + 'America/Guadeloupe': { lat: 0, long: 0 }, + 'America/Guatemala': { lat: 0, long: 0 }, + 'America/Guayaquil': { lat: 0, long: 0 }, + 'America/Guyana': { lat: 0, long: 0 }, + 'America/Halifax': { lat: 0, long: 0 }, + 'America/Havana': { lat: 0, long: 0 }, + 'America/Hermosillo': { lat: 0, long: 0 }, + 'America/Indiana/Indianapolis': { lat: 0, long: 0 }, + 'America/Indiana/Knox': { lat: 0, long: 0 }, + 'America/Indiana/Marengo': { lat: 0, long: 0 }, + 'America/Indiana/Petersburg': { lat: 0, long: 0 }, + 'America/Indiana/Tell_City': { lat: 0, long: 0 }, + 'America/Indiana/Vevay': { lat: 0, long: 0 }, + 'America/Indiana/Vincennes': { lat: 0, long: 0 }, + 'America/Indiana/Winamac': { lat: 0, long: 0 }, + 'America/Inuvik': { lat: 0, long: 0 }, + 'America/Iqaluit': { lat: 0, long: 0 }, + 'America/Jamaica': { lat: 0, long: 0 }, + 'America/Juneau': { lat: 0, long: 0 }, + 'America/Kentucky/Louisville': { lat: 0, long: 0 }, + 'America/Kentucky/Monticello': { lat: 0, long: 0 }, + 'America/Kralendijk': { lat: 0, long: 0 }, + 'America/La_Paz': { lat: 0, long: 0 }, + 'America/Lima': { lat: 0, long: 0 }, + 'America/Los_Angeles': { lat: 0, long: 0 }, + 'America/Lower_Princes': { lat: 0, long: 0 }, + 'America/Maceio': { lat: 0, long: 0 }, + 'America/Managua': { lat: 0, long: 0 }, + 'America/Manaus': { lat: 0, long: 0 }, + 'America/Marigot': { lat: 0, long: 0 }, + 'America/Martinique': { lat: 0, long: 0 }, + 'America/Matamoros': { lat: 0, long: 0 }, + 'America/Mazatlan': { lat: 0, long: 0 }, + 'America/Menominee': { lat: 0, long: 0 }, + 'America/Merida': { lat: 0, long: 0 }, + 'America/Metlakatla': { lat: 0, long: 0 }, + 'America/Mexico_City': { lat: 0, long: 0 }, + 'America/Miquelon': { lat: 0, long: 0 }, + 'America/Moncton': { lat: 0, long: 0 }, + 'America/Monterrey': { lat: 0, long: 0 }, + 'America/Montevideo': { lat: 0, long: 0 }, + 'America/Montserrat': { lat: 0, long: 0 }, + 'America/Nassau': { lat: 0, long: 0 }, + 'America/New_York': { lat: 0, long: 0 }, + 'America/Nipigon': { lat: 0, long: 0 }, + 'America/Nome': { lat: 0, long: 0 }, + 'America/Noronha': { lat: 0, long: 0 }, + 'America/North_Dakota/Beulah': { lat: 0, long: 0 }, + 'America/North_Dakota/Center': { lat: 0, long: 0 }, + 'America/North_Dakota/New_Salem': { lat: 0, long: 0 }, + 'America/Nuuk': { lat: 0, long: 0 }, + 'America/Ojinaga': { lat: 0, long: 0 }, + 'America/Panama': { lat: 0, long: 0 }, + 'America/Pangnirtung': { lat: 0, long: 0 }, + 'America/Paramaribo': { lat: 0, long: 0 }, + 'America/Phoenix': { lat: 0, long: 0 }, + 'America/Port-au-Prince': { lat: 0, long: 0 }, + 'America/Port_of_Spain': { lat: 0, long: 0 }, + 'America/Porto_Velho': { lat: 0, long: 0 }, + 'America/Puerto_Rico': { lat: 0, long: 0 }, + 'America/Punta_Arenas': { lat: 0, long: 0 }, + 'America/Rainy_River': { lat: 0, long: 0 }, + 'America/Rankin_Inlet': { lat: 0, long: 0 }, + 'America/Recife': { lat: 0, long: 0 }, + 'America/Regina': { lat: 0, long: 0 }, + 'America/Resolute': { lat: 0, long: 0 }, + 'America/Rio_Branco': { lat: 0, long: 0 }, + 'America/Santarem': { lat: 0, long: 0 }, + 'America/Santiago': { lat: 0, long: 0 }, + 'America/Santo_Domingo': { lat: 0, long: 0 }, + 'America/Sao_Paulo': { lat: 0, long: 0 }, + 'America/Scoresbysund': { lat: 0, long: 0 }, + 'America/Sitka': { lat: 0, long: 0 }, + 'America/St_Barthelemy': { lat: 0, long: 0 }, + 'America/St_Johns': { lat: 0, long: 0 }, + 'America/St_Kitts': { lat: 0, long: 0 }, + 'America/St_Lucia': { lat: 0, long: 0 }, + 'America/St_Thomas': { lat: 0, long: 0 }, + 'America/St_Vincent': { lat: 0, long: 0 }, + 'America/Swift_Current': { lat: 0, long: 0 }, + 'America/Tegucigalpa': { lat: 0, long: 0 }, + 'America/Thule': { lat: 0, long: 0 }, + 'America/Thunder_Bay': { lat: 0, long: 0 }, + 'America/Tijuana': { lat: 0, long: 0 }, + 'America/Toronto': { lat: 0, long: 0 }, + 'America/Tortola': { lat: 0, long: 0 }, + 'America/Vancouver': { lat: 0, long: 0 }, + 'America/Whitehorse': { lat: 0, long: 0 }, + 'America/Winnipeg': { lat: 0, long: 0 }, + 'America/Yakutat': { lat: 0, long: 0 }, + 'America/Yellowknife': { lat: 0, long: 0 }, + 'Antarctica/Casey': { lat: 0, long: 0 }, + 'Antarctica/Davis': { lat: 0, long: 0 }, + 'Antarctica/DumontDUrville': { lat: 0, long: 0 }, + 'Antarctica/Macquarie': { lat: 0, long: 0 }, + 'Antarctica/Mawson': { lat: 0, long: 0 }, + 'Antarctica/McMurdo': { lat: 0, long: 0 }, + 'Antarctica/Palmer': { lat: 0, long: 0 }, + 'Antarctica/Rothera': { lat: 0, long: 0 }, + 'Antarctica/Syowa': { lat: 0, long: 0 }, + 'Antarctica/Troll': { lat: 0, long: 0 }, + 'Antarctica/Vostok': { lat: 0, long: 0 }, + 'Arctic/Longyearbyen': { lat: 0, long: 0 }, + 'Asia/Aden': { lat: 0, long: 0 }, + 'Asia/Almaty': { lat: 0, long: 0 }, + 'Asia/Amman': { lat: 0, long: 0 }, + 'Asia/Anadyr': { lat: 0, long: 0 }, + 'Asia/Aqtau': { lat: 0, long: 0 }, + 'Asia/Aqtobe': { lat: 0, long: 0 }, + 'Asia/Ashgabat': { lat: 0, long: 0 }, + 'Asia/Atyrau': { lat: 0, long: 0 }, + 'Asia/Baghdad': { lat: 0, long: 0 }, + 'Asia/Bahrain': { lat: 0, long: 0 }, + 'Asia/Baku': { lat: 0, long: 0 }, + 'Asia/Bangkok': { lat: 0, long: 0 }, + 'Asia/Barnaul': { lat: 0, long: 0 }, + 'Asia/Beirut': { lat: 0, long: 0 }, + 'Asia/Bishkek': { lat: 0, long: 0 }, + 'Asia/Brunei': { lat: 0, long: 0 }, + 'Asia/Chita': { lat: 0, long: 0 }, + 'Asia/Choibalsan': { lat: 0, long: 0 }, + 'Asia/Colombo': { lat: 0, long: 0 }, + 'Asia/Damascus': { lat: 0, long: 0 }, + 'Asia/Dhaka': { lat: 0, long: 0 }, + 'Asia/Dili': { lat: 0, long: 0 }, + 'Asia/Dubai': { lat: 0, long: 0 }, + 'Asia/Dushanbe': { lat: 0, long: 0 }, + 'Asia/Famagusta': { lat: 0, long: 0 }, + 'Asia/Gaza': { lat: 0, long: 0 }, + 'Asia/Hebron': { lat: 0, long: 0 }, + 'Asia/Ho_Chi_Minh': { lat: 0, long: 0 }, + 'Asia/Hong_Kong': { lat: 0, long: 0 }, + 'Asia/Hovd': { lat: 0, long: 0 }, + 'Asia/Irkutsk': { lat: 0, long: 0 }, + 'Asia/Jakarta': { lat: 0, long: 0 }, + 'Asia/Jayapura': { lat: 0, long: 0 }, + 'Asia/Jerusalem': { lat: 0, long: 0 }, + 'Asia/Kabul': { lat: 0, long: 0 }, + 'Asia/Kamchatka': { lat: 0, long: 0 }, + 'Asia/Karachi': { lat: 0, long: 0 }, + 'Asia/Kathmandu': { lat: 0, long: 0 }, + 'Asia/Khandyga': { lat: 0, long: 0 }, + 'Asia/Kolkata': { lat: 0, long: 0 }, + 'Asia/Krasnoyarsk': { lat: 0, long: 0 }, + 'Asia/Kuala_Lumpur': { lat: 0, long: 0 }, + 'Asia/Kuching': { lat: 0, long: 0 }, + 'Asia/Kuwait': { lat: 0, long: 0 }, + 'Asia/Macau': { lat: 0, long: 0 }, + 'Asia/Magadan': { lat: 0, long: 0 }, + 'Asia/Makassar': { lat: 0, long: 0 }, + 'Asia/Manila': { lat: 0, long: 0 }, + 'Asia/Muscat': { lat: 0, long: 0 }, + 'Asia/Nicosia': { lat: 0, long: 0 }, + 'Asia/Novokuznetsk': { lat: 0, long: 0 }, + 'Asia/Novosibirsk': { lat: 0, long: 0 }, + 'Asia/Omsk': { lat: 0, long: 0 }, + 'Asia/Oral': { lat: 0, long: 0 }, + 'Asia/Phnom_Penh': { lat: 0, long: 0 }, + 'Asia/Pontianak': { lat: 0, long: 0 }, + 'Asia/Pyongyang': { lat: 0, long: 0 }, + 'Asia/Qatar': { lat: 0, long: 0 }, + 'Asia/Qostanay': { lat: 0, long: 0 }, + 'Asia/Qyzylorda': { lat: 0, long: 0 }, + 'Asia/Riyadh': { lat: 0, long: 0 }, + 'Asia/Sakhalin': { lat: 0, long: 0 }, + 'Asia/Samarkand': { lat: 0, long: 0 }, + 'Asia/Seoul': { lat: 0, long: 0 }, + 'Asia/Shanghai': { lat: 0, long: 0 }, + 'Asia/Singapore': { lat: 0, long: 0 }, + 'Asia/Srednekolymsk': { lat: 0, long: 0 }, + 'Asia/Taipei': { lat: 0, long: 0 }, + 'Asia/Tashkent': { lat: 0, long: 0 }, + 'Asia/Tbilisi': { lat: 0, long: 0 }, + 'Asia/Tehran': { lat: 0, long: 0 }, + 'Asia/Thimphu': { lat: 0, long: 0 }, + 'Asia/Tokyo': { lat: 0, long: 0 }, + 'Asia/Tomsk': { lat: 0, long: 0 }, + 'Asia/Ulaanbaatar': { lat: 0, long: 0 }, + 'Asia/Urumqi': { lat: 0, long: 0 }, + 'Asia/Ust-Nera': { lat: 0, long: 0 }, + 'Asia/Vientiane': { lat: 0, long: 0 }, + 'Asia/Vladivostok': { lat: 0, long: 0 }, + 'Asia/Yakutsk': { lat: 0, long: 0 }, + 'Asia/Yangon': { lat: 0, long: 0 }, + 'Asia/Yekaterinburg': { lat: 0, long: 0 }, + 'Asia/Yerevan': { lat: 0, long: 0 }, + 'Atlantic/Azores': { lat: 0, long: 0 }, + 'Atlantic/Bermuda': { lat: 0, long: 0 }, + 'Atlantic/Canary': { lat: 0, long: 0 }, + 'Atlantic/Cape_Verde': { lat: 0, long: 0 }, + 'Atlantic/Faroe': { lat: 0, long: 0 }, + 'Atlantic/Madeira': { lat: 0, long: 0 }, + 'Atlantic/Reykjavik': { lat: 0, long: 0 }, + 'Atlantic/South_Georgia': { lat: 0, long: 0 }, + 'Atlantic/St_Helena': { lat: 0, long: 0 }, + 'Atlantic/Stanley': { lat: 0, long: 0 }, + 'Australia/Adelaide': { lat: 0, long: 0 }, + 'Australia/Brisbane': { lat: 0, long: 0 }, + 'Australia/Broken_Hill': { lat: 0, long: 0 }, + 'Australia/Darwin': { lat: 0, long: 0 }, + 'Australia/Eucla': { lat: 0, long: 0 }, + 'Australia/Hobart': { lat: 0, long: 0 }, + 'Australia/Lindeman': { lat: 0, long: 0 }, + 'Australia/Lord_Howe': { lat: 0, long: 0 }, + 'Australia/Melbourne': { lat: 0, long: 0 }, + 'Australia/Perth': { lat: 0, long: 0 }, + 'Australia/Sydney': { lat: 0, long: 0 }, + 'Europe/Amsterdam': { lat: 0, long: 0 }, + 'Europe/Andorra': { lat: 0, long: 0 }, + 'Europe/Astrakhan': { lat: 0, long: 0 }, + 'Europe/Athens': { lat: 0, long: 0 }, + 'Europe/Belgrade': { lat: 0, long: 0 }, + 'Europe/Berlin': { lat: 0, long: 0 }, + 'Europe/Bratislava': { lat: 0, long: 0 }, + 'Europe/Brussels': { lat: 0, long: 0 }, + 'Europe/Bucharest': { lat: 0, long: 0 }, + 'Europe/Budapest': { lat: 0, long: 0 }, + 'Europe/Busingen': { lat: 0, long: 0 }, + 'Europe/Chisinau': { lat: 0, long: 0 }, + 'Europe/Copenhagen': { lat: 0, long: 0 }, + 'Europe/Dublin': { lat: 0, long: 0 }, + 'Europe/Gibraltar': { lat: 0, long: 0 }, + 'Europe/Guernsey': { lat: 0, long: 0 }, + 'Europe/Helsinki': { lat: 0, long: 0 }, + 'Europe/Isle_of_Man': { lat: 0, long: 0 }, + 'Europe/Istanbul': { lat: 0, long: 0 }, + 'Europe/Jersey': { lat: 0, long: 0 }, + 'Europe/Kaliningrad': { lat: 0, long: 0 }, + 'Europe/Kiev': { lat: 0, long: 0 }, + 'Europe/Kirov': { lat: 0, long: 0 }, + 'Europe/Lisbon': { lat: 0, long: 0 }, + 'Europe/Ljubljana': { lat: 0, long: 0 }, + 'Europe/London': { lat: 0, long: 0 }, + 'Europe/Luxembourg': { lat: 0, long: 0 }, + 'Europe/Madrid': { lat: 0, long: 0 }, + 'Europe/Malta': { lat: 0, long: 0 }, + 'Europe/Mariehamn': { lat: 0, long: 0 }, + 'Europe/Minsk': { lat: 0, long: 0 }, + 'Europe/Monaco': { lat: 0, long: 0 }, + 'Europe/Moscow': { lat: 0, long: 0 }, + 'Europe/Oslo': { lat: 0, long: 0 }, + 'Europe/Paris': { lat: 0, long: 0 }, + 'Europe/Podgorica': { lat: 0, long: 0 }, + 'Europe/Prague': { lat: 0, long: 0 }, + 'Europe/Riga': { lat: 0, long: 0 }, + 'Europe/Rome': { lat: 0, long: 0 }, + 'Europe/Samara': { lat: 0, long: 0 }, + 'Europe/San_Marino': { lat: 0, long: 0 }, + 'Europe/Sarajevo': { lat: 0, long: 0 }, + 'Europe/Saratov': { lat: 0, long: 0 }, + 'Europe/Simferopol': { lat: 0, long: 0 }, + 'Europe/Skopje': { lat: 0, long: 0 }, + 'Europe/Sofia': { lat: 0, long: 0 }, + 'Europe/Stockholm': { lat: 0, long: 0 }, + 'Europe/Tallinn': { lat: 0, long: 0 }, + 'Europe/Tirane': { lat: 0, long: 0 }, + 'Europe/Ulyanovsk': { lat: 0, long: 0 }, + 'Europe/Uzhgorod': { lat: 0, long: 0 }, + 'Europe/Vaduz': { lat: 0, long: 0 }, + 'Europe/Vatican': { lat: 0, long: 0 }, + 'Europe/Vienna': { lat: 0, long: 0 }, + 'Europe/Vilnius': { lat: 0, long: 0 }, + 'Europe/Volgograd': { lat: 0, long: 0 }, + 'Europe/Warsaw': { lat: 0, long: 0 }, + 'Europe/Zagreb': { lat: 0, long: 0 }, + 'Europe/Zaporozhye': { lat: 0, long: 0 }, + 'Europe/Zurich': { lat: 0, long: 0 }, + 'Indian/Antananarivo': { lat: 0, long: 0 }, + 'Indian/Chagos': { lat: 0, long: 0 }, + 'Indian/Christmas': { lat: 0, long: 0 }, + 'Indian/Cocos': { lat: 0, long: 0 }, + 'Indian/Comoro': { lat: 0, long: 0 }, + 'Indian/Kerguelen': { lat: 0, long: 0 }, + 'Indian/Mahe': { lat: 0, long: 0 }, + 'Indian/Maldives': { lat: 0, long: 0 }, + 'Indian/Mauritius': { lat: 0, long: 0 }, + 'Indian/Mayotte': { lat: 0, long: 0 }, + 'Indian/Reunion': { lat: 0, long: 0 }, + 'Pacific/Apia': { lat: 0, long: 0 }, + 'Pacific/Auckland': { lat: 0, long: 0 }, + 'Pacific/Bougainville': { lat: 0, long: 0 }, + 'Pacific/Chatham': { lat: 0, long: 0 }, + 'Pacific/Chuuk': { lat: 0, long: 0 }, + 'Pacific/Easter': { lat: 0, long: 0 }, + 'Pacific/Efate': { lat: 0, long: 0 }, + 'Pacific/Fakaofo': { lat: 0, long: 0 }, + 'Pacific/Fiji': { lat: 0, long: 0 }, + 'Pacific/Funafuti': { lat: 0, long: 0 }, + 'Pacific/Galapagos': { lat: 0, long: 0 }, + 'Pacific/Gambier': { lat: 0, long: 0 }, + 'Pacific/Guadalcanal': { lat: 0, long: 0 }, + 'Pacific/Guam': { lat: 0, long: 0 }, + 'Pacific/Honolulu': { lat: 0, long: 0 }, + // 'Pacific/Kanton': {lat: 0, long: 0}, // Why is this not valid?, + 'Pacific/Kiritimati': { lat: 0, long: 0 }, + 'Pacific/Kosrae': { lat: 0, long: 0 }, + 'Pacific/Kwajalein': { lat: 0, long: 0 }, + 'Pacific/Majuro': { lat: 0, long: 0 }, + 'Pacific/Marquesas': { lat: 0, long: 0 }, + 'Pacific/Midway': { lat: 0, long: 0 }, + 'Pacific/Nauru': { lat: 0, long: 0 }, + 'Pacific/Niue': { lat: 0, long: 0 }, + 'Pacific/Norfolk': { lat: 0, long: 0 }, + 'Pacific/Noumea': { lat: 0, long: 0 }, + 'Pacific/Pago_Pago': { lat: 0, long: 0 }, + 'Pacific/Palau': { lat: 0, long: 0 }, + 'Pacific/Pitcairn': { lat: 0, long: 0 }, + 'Pacific/Pohnpei': { lat: 0, long: 0 }, + 'Pacific/Port_Moresby': { lat: 0, long: 0 }, + 'Pacific/Rarotonga': { lat: 0, long: 0 }, + 'Pacific/Saipan': { lat: 0, long: 0 }, + 'Pacific/Tahiti': { lat: 0, long: 0 }, + 'Pacific/Tarawa': { lat: 0, long: 0 }, + 'Pacific/Tongatapu': { lat: 0, long: 0 }, + 'Pacific/Wake': { lat: 0, long: 0 }, + 'Pacific/Wallis': { lat: 0, long: 0 }, } \ No newline at end of file diff --git a/src/app/timezone/services/timezone.service.ts b/src/app/timezone/services/timezone.service.ts index 9b182d4..aa2676c 100644 --- a/src/app/timezone/services/timezone.service.ts +++ b/src/app/timezone/services/timezone.service.ts @@ -1,459 +1,36 @@ import { Injectable } from '@angular/core'; import { DateTime } from 'luxon'; -import { Timezone, TimezoneCompare } from '../models/timezone.model'; +import { Timezone, TimezoneCompare, TimezoneList } from '../models/timezone.model'; @Injectable({ providedIn: 'root' }) export class TimezoneService { - timezones: string[] = [ - 'Africa/Abidjan', - 'Africa/Accra', - 'Africa/Addis_Ababa', - 'Africa/Algiers', - 'Africa/Asmara', - 'Africa/Bamako', - 'Africa/Bangui', - 'Africa/Banjul', - 'Africa/Bissau', - 'Africa/Blantyre', - 'Africa/Brazzaville', - 'Africa/Bujumbura', - 'Africa/Cairo', - 'Africa/Casablanca', - 'Africa/Ceuta', - 'Africa/Conakry', - 'Africa/Dakar', - 'Africa/Dar_es_Salaam', - 'Africa/Djibouti', - 'Africa/Douala', - 'Africa/El_Aaiun', - 'Africa/Freetown', - 'Africa/Gaborone', - 'Africa/Harare', - 'Africa/Johannesburg', - 'Africa/Juba', - 'Africa/Kampala', - 'Africa/Khartoum', - 'Africa/Kigali', - 'Africa/Kinshasa', - 'Africa/Lagos', - 'Africa/Libreville', - 'Africa/Lome', - 'Africa/Luanda', - 'Africa/Lubumbashi', - 'Africa/Lusaka', - 'Africa/Malabo', - 'Africa/Maputo', - 'Africa/Maseru', - 'Africa/Mbabane', - 'Africa/Mogadishu', - 'Africa/Monrovia', - 'Africa/Nairobi', - 'Africa/Ndjamena', - 'Africa/Niamey', - 'Africa/Nouakchott', - 'Africa/Ouagadougou', - 'Africa/Porto-Novo', - 'Africa/Sao_Tome', - 'Africa/Tripoli', - 'Africa/Tunis', - 'Africa/Windhoek', - 'America/Adak', - 'America/Anchorage', - 'America/Anguilla', - 'America/Antigua', - 'America/Araguaina', - 'America/Argentina/Buenos_Aires', - 'America/Argentina/Catamarca', - 'America/Argentina/Cordoba', - 'America/Argentina/Jujuy', - 'America/Argentina/La_Rioja', - 'America/Argentina/Mendoza', - 'America/Argentina/Rio_Gallegos', - 'America/Argentina/Salta', - 'America/Argentina/San_Juan', - 'America/Argentina/San_Luis', - 'America/Argentina/Tucuman', - 'America/Argentina/Ushuaia', - 'America/Aruba', - 'America/Asuncion', - 'America/Atikokan', - 'America/Bahia', - 'America/Bahia_Banderas', - 'America/Barbados', - 'America/Belem', - 'America/Belize', - 'America/Blanc-Sablon', - 'America/Boa_Vista', - 'America/Bogota', - 'America/Boise', - 'America/Cambridge_Bay', - 'America/Campo_Grande', - 'America/Cancun', - 'America/Caracas', - 'America/Cayenne', - 'America/Cayman', - 'America/Chicago', - 'America/Chihuahua', - 'America/Costa_Rica', - 'America/Creston', - 'America/Cuiaba', - 'America/Curacao', - 'America/Danmarkshavn', - 'America/Dawson', - 'America/Dawson_Creek', - 'America/Denver', - 'America/Detroit', - 'America/Dominica', - 'America/Edmonton', - 'America/Eirunepe', - 'America/El_Salvador', - 'America/Fort_Nelson', - 'America/Fortaleza', - 'America/Glace_Bay', - 'America/Goose_Bay', - 'America/Grand_Turk', - 'America/Grenada', - 'America/Guadeloupe', - 'America/Guatemala', - 'America/Guayaquil', - 'America/Guyana', - 'America/Halifax', - 'America/Havana', - 'America/Hermosillo', - 'America/Indiana/Indianapolis', - 'America/Indiana/Knox', - 'America/Indiana/Marengo', - 'America/Indiana/Petersburg', - 'America/Indiana/Tell_City', - 'America/Indiana/Vevay', - 'America/Indiana/Vincennes', - 'America/Indiana/Winamac', - 'America/Inuvik', - 'America/Iqaluit', - 'America/Jamaica', - 'America/Juneau', - 'America/Kentucky/Louisville', - 'America/Kentucky/Monticello', - 'America/Kralendijk', - 'America/La_Paz', - 'America/Lima', - 'America/Los_Angeles', - 'America/Lower_Princes', - 'America/Maceio', - 'America/Managua', - 'America/Manaus', - 'America/Marigot', - 'America/Martinique', - 'America/Matamoros', - 'America/Mazatlan', - 'America/Menominee', - 'America/Merida', - 'America/Metlakatla', - 'America/Mexico_City', - 'America/Miquelon', - 'America/Moncton', - 'America/Monterrey', - 'America/Montevideo', - 'America/Montserrat', - 'America/Nassau', - 'America/New_York', - 'America/Nipigon', - 'America/Nome', - 'America/Noronha', - 'America/North_Dakota/Beulah', - 'America/North_Dakota/Center', - 'America/North_Dakota/New_Salem', - 'America/Nuuk', - 'America/Ojinaga', - 'America/Panama', - 'America/Pangnirtung', - 'America/Paramaribo', - 'America/Phoenix', - 'America/Port-au-Prince', - 'America/Port_of_Spain', - 'America/Porto_Velho', - 'America/Puerto_Rico', - 'America/Punta_Arenas', - 'America/Rainy_River', - 'America/Rankin_Inlet', - 'America/Recife', - 'America/Regina', - 'America/Resolute', - 'America/Rio_Branco', - 'America/Santarem', - 'America/Santiago', - 'America/Santo_Domingo', - 'America/Sao_Paulo', - 'America/Scoresbysund', - 'America/Sitka', - 'America/St_Barthelemy', - 'America/St_Johns', - 'America/St_Kitts', - 'America/St_Lucia', - 'America/St_Thomas', - 'America/St_Vincent', - 'America/Swift_Current', - 'America/Tegucigalpa', - 'America/Thule', - 'America/Thunder_Bay', - 'America/Tijuana', - 'America/Toronto', - 'America/Tortola', - 'America/Vancouver', - 'America/Whitehorse', - 'America/Winnipeg', - 'America/Yakutat', - 'America/Yellowknife', - 'Antarctica/Casey', - 'Antarctica/Davis', - 'Antarctica/DumontDUrville', - 'Antarctica/Macquarie', - 'Antarctica/Mawson', - 'Antarctica/McMurdo', - 'Antarctica/Palmer', - 'Antarctica/Rothera', - 'Antarctica/Syowa', - 'Antarctica/Troll', - 'Antarctica/Vostok', - 'Arctic/Longyearbyen', - 'Asia/Aden', - 'Asia/Almaty', - 'Asia/Amman', - 'Asia/Anadyr', - 'Asia/Aqtau', - 'Asia/Aqtobe', - 'Asia/Ashgabat', - 'Asia/Atyrau', - 'Asia/Baghdad', - 'Asia/Bahrain', - 'Asia/Baku', - 'Asia/Bangkok', - 'Asia/Barnaul', - 'Asia/Beirut', - 'Asia/Bishkek', - 'Asia/Brunei', - 'Asia/Chita', - 'Asia/Choibalsan', - 'Asia/Colombo', - 'Asia/Damascus', - 'Asia/Dhaka', - 'Asia/Dili', - 'Asia/Dubai', - 'Asia/Dushanbe', - 'Asia/Famagusta', - 'Asia/Gaza', - 'Asia/Hebron', - 'Asia/Ho_Chi_Minh', - 'Asia/Hong_Kong', - 'Asia/Hovd', - 'Asia/Irkutsk', - 'Asia/Jakarta', - 'Asia/Jayapura', - 'Asia/Jerusalem', - 'Asia/Kabul', - 'Asia/Kamchatka', - 'Asia/Karachi', - 'Asia/Kathmandu', - 'Asia/Khandyga', - 'Asia/Kolkata', - 'Asia/Krasnoyarsk', - 'Asia/Kuala_Lumpur', - 'Asia/Kuching', - 'Asia/Kuwait', - 'Asia/Macau', - 'Asia/Magadan', - 'Asia/Makassar', - 'Asia/Manila', - 'Asia/Muscat', - 'Asia/Nicosia', - 'Asia/Novokuznetsk', - 'Asia/Novosibirsk', - 'Asia/Omsk', - 'Asia/Oral', - 'Asia/Phnom_Penh', - 'Asia/Pontianak', - 'Asia/Pyongyang', - 'Asia/Qatar', - 'Asia/Qostanay', - 'Asia/Qyzylorda', - 'Asia/Riyadh', - 'Asia/Sakhalin', - 'Asia/Samarkand', - 'Asia/Seoul', - 'Asia/Shanghai', - 'Asia/Singapore', - 'Asia/Srednekolymsk', - 'Asia/Taipei', - 'Asia/Tashkent', - 'Asia/Tbilisi', - 'Asia/Tehran', - 'Asia/Thimphu', - 'Asia/Tokyo', - 'Asia/Tomsk', - 'Asia/Ulaanbaatar', - 'Asia/Urumqi', - 'Asia/Ust-Nera', - 'Asia/Vientiane', - 'Asia/Vladivostok', - 'Asia/Yakutsk', - 'Asia/Yangon', - 'Asia/Yekaterinburg', - 'Asia/Yerevan', - 'Atlantic/Azores', - 'Atlantic/Bermuda', - 'Atlantic/Canary', - 'Atlantic/Cape_Verde', - 'Atlantic/Faroe', - 'Atlantic/Madeira', - 'Atlantic/Reykjavik', - 'Atlantic/South_Georgia', - 'Atlantic/St_Helena', - 'Atlantic/Stanley', - 'Australia/Adelaide', - 'Australia/Brisbane', - 'Australia/Broken_Hill', - 'Australia/Darwin', - 'Australia/Eucla', - 'Australia/Hobart', - 'Australia/Lindeman', - 'Australia/Lord_Howe', - 'Australia/Melbourne', - 'Australia/Perth', - 'Australia/Sydney', - 'Europe/Amsterdam', - 'Europe/Andorra', - 'Europe/Astrakhan', - 'Europe/Athens', - 'Europe/Belgrade', - 'Europe/Berlin', - 'Europe/Bratislava', - 'Europe/Brussels', - 'Europe/Bucharest', - 'Europe/Budapest', - 'Europe/Busingen', - 'Europe/Chisinau', - 'Europe/Copenhagen', - 'Europe/Dublin', - 'Europe/Gibraltar', - 'Europe/Guernsey', - 'Europe/Helsinki', - 'Europe/Isle_of_Man', - 'Europe/Istanbul', - 'Europe/Jersey', - 'Europe/Kaliningrad', - 'Europe/Kiev', - 'Europe/Kirov', - 'Europe/Lisbon', - 'Europe/Ljubljana', - 'Europe/London', - 'Europe/Luxembourg', - 'Europe/Madrid', - 'Europe/Malta', - 'Europe/Mariehamn', - 'Europe/Minsk', - 'Europe/Monaco', - 'Europe/Moscow', - 'Europe/Oslo', - 'Europe/Paris', - 'Europe/Podgorica', - 'Europe/Prague', - 'Europe/Riga', - 'Europe/Rome', - 'Europe/Samara', - 'Europe/San_Marino', - 'Europe/Sarajevo', - 'Europe/Saratov', - 'Europe/Simferopol', - 'Europe/Skopje', - 'Europe/Sofia', - 'Europe/Stockholm', - 'Europe/Tallinn', - 'Europe/Tirane', - 'Europe/Ulyanovsk', - 'Europe/Uzhgorod', - 'Europe/Vaduz', - 'Europe/Vatican', - 'Europe/Vienna', - 'Europe/Vilnius', - 'Europe/Volgograd', - 'Europe/Warsaw', - 'Europe/Zagreb', - 'Europe/Zaporozhye', - 'Europe/Zurich', - 'Indian/Antananarivo', - 'Indian/Chagos', - 'Indian/Christmas', - 'Indian/Cocos', - 'Indian/Comoro', - 'Indian/Kerguelen', - 'Indian/Mahe', - 'Indian/Maldives', - 'Indian/Mauritius', - 'Indian/Mayotte', - 'Indian/Reunion', - 'Pacific/Apia', - 'Pacific/Auckland', - 'Pacific/Bougainville', - 'Pacific/Chatham', - 'Pacific/Chuuk', - 'Pacific/Easter', - 'Pacific/Efate', - 'Pacific/Fakaofo', - 'Pacific/Fiji', - 'Pacific/Funafuti', - 'Pacific/Galapagos', - 'Pacific/Gambier', - 'Pacific/Guadalcanal', - 'Pacific/Guam', - 'Pacific/Honolulu', - // 'Pacific/Kanton', // Why is this not valid? - 'Pacific/Kiritimati', - 'Pacific/Kosrae', - 'Pacific/Kwajalein', - 'Pacific/Majuro', - 'Pacific/Marquesas', - 'Pacific/Midway', - 'Pacific/Nauru', - 'Pacific/Niue', - 'Pacific/Norfolk', - 'Pacific/Noumea', - 'Pacific/Pago_Pago', - 'Pacific/Palau', - 'Pacific/Pitcairn', - 'Pacific/Pohnpei', - 'Pacific/Port_Moresby', - 'Pacific/Rarotonga', - 'Pacific/Saipan', - 'Pacific/Tahiti', - 'Pacific/Tarawa', - 'Pacific/Tongatapu', - 'Pacific/Wake', - 'Pacific/Wallis', - ] - constructor() { } + public getCurrentTimezone() { + return DateTime.now().zoneName + } + public getTimezones(): string[] { - return this.timezones + return TimezoneList() } public getCurrentTimeForTimezone(timezone: string): DateTime | null { - + var dateTime = DateTime.local().setZone(timezone) return dateTime.isValid ? dateTime : null; - + } public getCurrentTimeInTimezones(timezones: string[]): Timezone[] { var dates: Timezone[] = []; - this.timezones.forEach(element => { + timezones.forEach(element => { var date = this.getCurrentTimeForTimezone(element); - if(date != null){ + if (date != null) { dates.push({ name: element, time: date }) } });