Skip to content

Commit dbee298

Browse files
committed
add new timezones and add names
1 parent f8384a7 commit dbee298

File tree

3 files changed

+104
-45
lines changed

3 files changed

+104
-45
lines changed

index.ts

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import timezones from "./timezones";
1+
import timezones, {timezonesType} from "./timezones";
22

33
interface formattedTime {
44
hours: number;
@@ -11,7 +11,8 @@ interface tizoResult {
1111
original: [number, number];
1212
utc: [number, number];
1313
local: [number, number];
14-
timezones: any;
14+
timezones: timezonesType;
15+
inputTimezone: {offset: number | [number, number]; name: string};
1516
}
1617

1718
/** Get Date()'s local offset and translate Date()'s answer from minutes to hours */
@@ -38,6 +39,20 @@ function applyOffset(dateObj: Date, offset: number | [number, number]) {
3839
}
3940
}
4041

42+
function fetchTimezone(
43+
key: string
44+
): {offset: number | [number, number]; name: string} {
45+
if (key === undefined) {
46+
return {offset: 0, name: ""};
47+
}
48+
49+
if (timezones[key]) {
50+
return timezones[key];
51+
} else {
52+
throw new Error(`Timezone not found: ${key}`);
53+
}
54+
}
55+
4156
function converter(input: formattedTime): tizoResult {
4257
let hours = 0;
4358

@@ -63,18 +78,14 @@ function converter(input: formattedTime): tizoResult {
6378
}
6479

6580
const minutes = input.minutes;
66-
67-
let offset: number | [number, number];
68-
if (timezones[input.timezone]) {
69-
offset = timezones[input.timezone];
70-
}
81+
const inputTimezone = fetchTimezone(input.timezone);
7182

7283
const timeObj = new Date();
7384
timeObj.setHours(hours);
7485
timeObj.setMinutes(minutes);
7586

7687
const timeObjUTC = new Date(timeObj.getTime());
77-
applyOffset(timeObjUTC, offset);
88+
applyOffset(timeObjUTC, inputTimezone.offset);
7889

7990
const timeObjLocal = new Date(timeObjUTC.getTime());
8091
applyOffset(timeObjLocal, getLocalOffset());
@@ -83,7 +94,8 @@ function converter(input: formattedTime): tizoResult {
8394
original: [timeObj.getHours(), timeObj.getMinutes()],
8495
utc: [timeObjUTC.getHours(), timeObjUTC.getMinutes()],
8596
local: [timeObjLocal.getHours(), timeObjLocal.getMinutes()],
86-
timezones: timezones,
97+
timezones,
98+
inputTimezone,
8799
};
88100
}
89101

@@ -100,7 +112,7 @@ export default (input: string): tizoResult => {
100112
hours: Number(formattedInputArr[1]),
101113
minutes: Number(formattedInputArr[2] || 0),
102114
amOrPm: formattedInputArr[3],
103-
timezone: formattedInputArr[4] || "utc",
115+
timezone: formattedInputArr[4],
104116
};
105117

106118
if (

test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,21 @@ test("am/pm", t => {
4646
t.deepEqual(tizo("11pm").utc, [23, 0]);
4747
t.deepEqual(tizo("12pm").utc, [12, 0]);
4848
});
49+
50+
test("get input timezone", t => {
51+
t.deepEqual(tizo("09 30 pt").inputTimezone, {
52+
name: "Pacific Time",
53+
offset: -8,
54+
});
55+
});
56+
57+
test("default input timezone", t => {
58+
t.deepEqual(tizo("9").inputTimezone, {
59+
name: "",
60+
offset: 0,
61+
});
62+
});
63+
64+
test("throws if unrecognized timezone", t => {
65+
t.throws(() => tizo("12 am ooooot"));
66+
});

timezones.ts

Lines changed: 64 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,65 @@
1-
/** Get the offset of a timezone (key) in hours or [hours, minutes] */
2-
export default {
3-
// Europe
4-
utc: "0",
5-
gmt: "0",
6-
bst: "+1",
7-
ist: "+1",
8-
wet: "0",
9-
west: "+1",
10-
cet: "+1",
11-
cest: "+2",
12-
eet: "+2",
13-
eest: "+3",
14-
msk: "+3",
15-
msd: "+4",
16-
// US/Canada
17-
ast: "-4",
18-
adt: "-3",
19-
est: "-5",
20-
edt: "-4",
21-
cst: "-6",
22-
cdt: "-5",
23-
mst: "-7",
24-
mdt: "-6",
25-
pst: "-8",
26-
pdt: "-7",
27-
hst: "-10",
28-
akst: "-9",
29-
akdt: "-8",
30-
// Australia
31-
aest: "+10",
32-
aedt: "+11",
33-
acst: ["+9", "30"],
34-
acdt: ["+10", "30"],
35-
awst: "+8",
1+
export interface timezonesType {
2+
[timezone: string]: {offset: number | [number, number]; name: string};
3+
}
4+
5+
/** Get the offset of a timezone (key) in hours or [hours, minutes], and the name */
6+
const timezones: timezonesType = {
7+
idlw: {offset: -12, name: "International Date Line West"},
8+
hast: {offset: -10, name: "Hawaii-Aleutian Standard Time"},
9+
hdt: {offset: -9, name: "Hawai Daylight Time"},
10+
akst: {offset: -9, name: "Alaska Standard Time"},
11+
yst: {offset: -9, name: "Yukon Standard Time"},
12+
akdt: {offset: -8, name: "Alaska Daylight Time"},
13+
ydt: {offset: -8, name: "Yukon Daylight Time"},
14+
pst: {offset: -8, name: "Pacific Standard Time"},
15+
pt: {offset: -8, name: "Pacific Time"},
16+
pdt: {offset: -7, name: "Pacific Daylight Time"},
17+
mst: {offset: -7, name: "Mountain Standard Time"},
18+
mdt: {offset: -6, name: "Mountain Daylight Time"},
19+
cst: {offset: -6, name: "Central Standard Time"},
20+
cdt: {offset: -5, name: "Central Daylight Time"},
21+
est: {offset: -5, name: "Eastern Standard Time"},
22+
edt: {offset: -4, name: "Eastern Daylight Time"},
23+
ast: {offset: -4, name: "Atlantic Standard Time"},
24+
adt: {offset: -3, name: "Atlantic Daylight Time"},
25+
nst: {offset: [-3, -30], name: "Newfoundland Standard Time"},
26+
ndt: {offset: [-2, -30], name: "Newfoundland Daylight Time"},
27+
wet: {offset: 0, name: "West European Time"},
28+
utc: {offset: 0, name: "Coordinated Universal Time"},
29+
gmt: {offset: 0, name: "Greenwhich Mean Time"},
30+
west: {offset: 1, name: "West European Summer Time"},
31+
wedt: {offset: 1, name: "West European Daylight Time"},
32+
bst: {offset: 1, name: "British Summer Time"},
33+
cet: {offset: 1, name: "Central European Time"},
34+
met: {offset: 1, name: "Middle European Time"},
35+
cest: {offset: 2, name: "Central European Summer Time"},
36+
cedt: {offset: 2, name: "Central European Daylight Time"},
37+
mest: {offset: 2, name: "Middle European Summer Time"},
38+
wast: {offset: 2, name: "West Africa Summer Time"},
39+
eet: {offset: 2, name: "East European Time"},
40+
cat: {offset: 2, name: "Central Africa Time"},
41+
sast: {offset: 2, name: "South Africa Standard Time"},
42+
eest: {offset: 3, name: "East European Summer Time"},
43+
eedt: {offset: 3, name: "East European Daylight Time"},
44+
bt: {offset: 3, name: "Baghdad Time"},
45+
msk: {offset: 3, name: "Moscow Time"},
46+
eat: {offset: 3, name: "East African Time"},
47+
irt: {offset: [3, 30], name: "Iran Time"},
48+
irst: {offset: [4, 30], name: "Iran Summer Time"},
49+
ist: {offset: [5, 30], name: "Indian Standard Time"},
50+
ict: {offset: 7, name: "Indochina Time"},
51+
cnst: {offset: 8, name: "China Standard Time"},
52+
awst: {offset: 8, name: "Australian Western Standard Time"},
53+
jst: {offset: 9, name: "Japan/Korea Standard Time"},
54+
awdt: {offset: 9, name: "Australian Western Daylight Time"},
55+
acst: {offset: [9, 30], name: "Australian Central Standard Time"},
56+
acdt: {offset: [10, 30], name: "Australian Central Daylight Time"},
57+
aest: {offset: 10, name: "Australian Eastern Standard Time"},
58+
aedt: {offset: 11, name: "Australian Eastern Daylight Time"},
59+
nft: {offset: 11, name: "Norfolk Time"},
60+
idle: {offset: 12, name: "International Date Line East"},
61+
nzst: {offset: 12, name: "New Zealand Standard Time"},
62+
nzdt: {offset: 13, name: "New Zealand Daylight Time"},
3663
};
64+
65+
export default timezones;

0 commit comments

Comments
 (0)