Skip to content

Commit

Permalink
feat: pm/am in format
Browse files Browse the repository at this point in the history
  • Loading branch information
badosz0 committed Jan 3, 2024
1 parent ef22abc commit c1d8714
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 40 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "holy-time",
"version": "3.3.0",
"version": "3.4.0",
"description": "Utility functions",
"repository": "Yet another (type-safe) date time library",
"main": "dist/index.js",
Expand Down
28 changes: 14 additions & 14 deletions src/__tests__/end-of.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,23 +16,23 @@ describe('test HolyTime.endOf', () => {
describe('test endOf with timeZone', () => {
it('should return end of unit in timeZone', () => {
const date = new HolyTime(new Date('2023-01-01T01:02:03.000Z'));
expect(date.endOf('hour', 'America/New_York').format('YYYY-MM-DD hh:mm:ss')).toBe('2023-01-01 01:59:59');
expect(date.endOf('hour', 'America/New_York').format('YYYY-MM-DD hh:mm:ss', 'Europe/Berlin')).toBe('2023-01-01 02:59:59');
expect(date.endOf('hour', 'America/New_York').format('YYYY-MM-DD HH:mm:ss')).toBe('2023-01-01 01:59:59');
expect(date.endOf('hour', 'America/New_York').format('YYYY-MM-DD HH:mm:ss', 'Europe/Berlin')).toBe('2023-01-01 02:59:59');

expect(date.endOf('day', 'Europe/London').format('YYYY-MM-DD hh:mm:ss')).toBe('2023-01-01 23:59:59');
expect(date.endOf('day', 'America/New_York').format('YYYY-MM-DD hh:mm:ss', 'Europe/London')).toBe('2023-01-01 04:59:59');
expect(date.endOf('day', 'Europe/Berlin').format('YYYY-MM-DD hh:mm:ss', 'America/New_York')).toBe('2023-01-01 19:59:59');
expect(date.endOf('day', 'Europe/London').format('YYYY-MM-DD HH:mm:ss')).toBe('2023-01-01 23:59:59');
expect(date.endOf('day', 'America/New_York').format('YYYY-MM-DD HH:mm:ss', 'Europe/London')).toBe('2023-01-01 04:59:59');
expect(date.endOf('day', 'Europe/Berlin').format('YYYY-MM-DD HH:mm:ss', 'America/New_York')).toBe('2023-01-01 19:59:59');

expect(date.endOf('week', 'Europe/London').format('YYYY-MM-DD hh:mm:ss')).toBe('2023-01-07 23:59:59');
expect(date.endOf('week', 'Europe/London').format('YYYY-MM-DD hh:mm:ss', 'America/New_York')).toBe('2023-01-07 18:59:59');
expect(date.endOf('week', 'America/New_York').format('YYYY-MM-DD hh:mm:ss', 'Europe/London')).toBe('2023-01-01 04:59:59');
expect(date.endOf('week', 'Europe/London').format('YYYY-MM-DD HH:mm:ss')).toBe('2023-01-07 23:59:59');
expect(date.endOf('week', 'Europe/London').format('YYYY-MM-DD HH:mm:ss', 'America/New_York')).toBe('2023-01-07 18:59:59');
expect(date.endOf('week', 'America/New_York').format('YYYY-MM-DD HH:mm:ss', 'Europe/London')).toBe('2023-01-01 04:59:59');

expect(date.endOf('month', 'Europe/London').format('YYYY-MM-DD hh:mm:ss')).toBe('2023-01-31 23:59:59');
expect(date.endOf('month', 'Europe/London').format('YYYY-MM-DD hh:mm:ss', 'America/New_York')).toBe('2023-01-31 18:59:59');
expect(date.endOf('month', 'America/New_York').format('YYYY-MM-DD hh:mm:ss', 'Europe/London')).toBe('2023-01-01 04:59:59');
expect(date.endOf('month', 'Europe/London').format('YYYY-MM-DD HH:mm:ss')).toBe('2023-01-31 23:59:59');
expect(date.endOf('month', 'Europe/London').format('YYYY-MM-DD HH:mm:ss', 'America/New_York')).toBe('2023-01-31 18:59:59');
expect(date.endOf('month', 'America/New_York').format('YYYY-MM-DD HH:mm:ss', 'Europe/London')).toBe('2023-01-01 04:59:59');

expect(date.endOf('year', 'Europe/London').format('YYYY-MM-DD hh:mm:ss')).toBe('2023-12-31 23:59:59');
expect(date.endOf('year', 'Europe/London').format('YYYY-MM-DD hh:mm:ss', 'America/New_York')).toBe('2023-12-31 18:59:59');
expect(date.endOf('year', 'America/New_York').format('YYYY-MM-DD hh:mm:ss', 'Europe/London')).toBe('2023-01-01 04:59:59');
expect(date.endOf('year', 'Europe/London').format('YYYY-MM-DD HH:mm:ss')).toBe('2023-12-31 23:59:59');
expect(date.endOf('year', 'Europe/London').format('YYYY-MM-DD HH:mm:ss', 'America/New_York')).toBe('2023-12-31 18:59:59');
expect(date.endOf('year', 'America/New_York').format('YYYY-MM-DD HH:mm:ss', 'Europe/London')).toBe('2023-01-01 04:59:59');
});
});
16 changes: 8 additions & 8 deletions src/__tests__/format.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ describe('test HolyTime.format without timeZone', () => {
it('should format date', () => {
const date = new HolyTime(new Date('2023-01-01T13:45:30.000Z'));

expect(date.format('YYYY-MM-DD hh:mm:ss')).toBe('2023-01-01 13:45:30');
expect(date.format('YYYY-MM-DD HH:mm:ss')).toBe('2023-01-01 13:45:30');
});

it('should format year', () => {
Expand All @@ -30,8 +30,8 @@ describe('test HolyTime.format without timeZone', () => {

it('should format hour', () => {
const date = new HolyTime(new Date('2023-01-01T13:00:00.000Z'));
expect(date.format('hh')).toBe('13');
expect(date.format('h')).toBe('13');
expect(date.format('HH')).toBe('13');
expect(date.format('H')).toBe('13');
});

it('should format minute', () => {
Expand All @@ -53,7 +53,7 @@ describe('test HolyTime.format without timeZone', () => {

it('should format date with mixed valid and invalid tokens', () => {
const date = new HolyTime(new Date('2023-01-01T15:45:30.000Z'));
expect(date.format('Year: YYYY, Hour: hh, Unknown: UUU')).toBe('Year: 2023, Hour: 15, Unknown: UUU');
expect(date.format('[Year:] YYYY, [Hour:] HH, [Unknown:] UUU')).toBe('Year: 2023, Hour: 15, Unknown: UUU');
});

it('should handle empty format string correctly', () => {
Expand All @@ -66,25 +66,25 @@ describe('test HolyTime.format with timeZone', () => {
it('should format date from UTC to America/New_York with 4h difference', () => {
const date = new HolyTime(new Date('2023-04-01T00:00:00.000Z'));

expect(date.format('YYYY-MM-DD hh:mm:ss', 'America/New_York')).toBe('2023-03-31 20:00:00');
expect(date.format('YYYY-MM-DD HH:mm:ss', 'America/New_York')).toBe('2023-03-31 20:00:00');
});

it('should format date from UTC to America/New_York with 5h difference', () => {
const date = new HolyTime(new Date('2023-08-01T00:00:00.000Z'));
const format = 'YYYY-MM-DD hh:mm:ss';
const format = 'YYYY-MM-DD HH:mm:ss';

expect(date.format(format, 'America/New_York')).toBe('2023-07-31 20:00:00');
});

it('should format date from UTC to America/New_York with 6h difference', () => {
const date = new HolyTime(new Date('2023-12-01T00:00:00.000Z'));

expect(date.format('YYYY-MM-DD hh:mm:ss', 'America/New_York')).toBe('2023-11-30 19:00:00');
expect(date.format('YYYY-MM-DD HH:mm:ss', 'America/New_York')).toBe('2023-11-30 19:00:00');
});

it('should format date from UTC to Europe/Berlin with 1h difference', () => {
const date = new HolyTime(new Date('2023-04-01T00:00:00.000Z'));

expect(date.format('YYYY-MM-DD hh:mm:ss', 'Europe/Berlin')).toBe('2023-04-01 02:00:00');
expect(date.format('YYYY-MM-DD HH:mm:ss', 'Europe/Berlin')).toBe('2023-04-01 02:00:00');
});
});
28 changes: 14 additions & 14 deletions src/__tests__/start-of.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,24 @@ describe('test HolyTime.startOf', () => {
describe('test startOf with timeZone', () => {
it('should return start of unit in timeZone', () => {
const date = new HolyTime(new Date('2023-01-01T01:02:03.000Z'));
expect(date.startOf('hour', 'America/New_York').format('YYYY-MM-DD hh:mm:ss')).toBe('2023-01-01 01:00:00');
expect(date.startOf('hour', 'America/New_York').format('YYYY-MM-DD hh:mm:ss', 'Europe/Berlin')).toBe('2023-01-01 02:00:00');
expect(date.startOf('hour', 'America/New_York').format('YYYY-MM-DD HH:mm:ss')).toBe('2023-01-01 01:00:00');
expect(date.startOf('hour', 'America/New_York').format('YYYY-MM-DD HH:mm:ss', 'Europe/Berlin')).toBe('2023-01-01 02:00:00');

expect(date.startOf('day', 'Europe/London').format('YYYY-MM-DD hh:mm:ss')).toBe('2023-01-01 00:00:00');
expect(date.startOf('day', 'America/New_York').format('YYYY-MM-DD hh:mm:ss', 'Europe/London')).toBe('2022-12-31 05:00:00');
expect(date.startOf('day', 'Europe/Berlin').format('YYYY-MM-DD hh:mm:ss', 'America/New_York')).toBe('2022-12-31 20:00:00');
expect(date.startOf('day', 'Europe/London').format('YYYY-MM-DD HH:mm:ss')).toBe('2023-01-01 00:00:00');
expect(date.startOf('day', 'America/New_York').format('YYYY-MM-DD HH:mm:ss', 'Europe/London')).toBe('2022-12-31 05:00:00');
expect(date.startOf('day', 'Europe/Berlin').format('YYYY-MM-DD HH:mm:ss', 'America/New_York')).toBe('2022-12-31 20:00:00');

expect(date.startOf('week', 'Europe/London').format('YYYY-MM-DD hh:mm:ss')).toBe('2023-01-01 00:00:00');
expect(date.startOf('week', 'Europe/London').format('YYYY-MM-DD hh:mm:ss', 'America/New_York')).toBe('2022-12-31 19:00:00');
expect(date.startOf('week', 'America/New_York').format('YYYY-MM-DD hh:mm:ss', 'Europe/London')).toBe('2022-12-25 05:00:00');
expect(date.startOf('week', 'Europe/London').format('YYYY-MM-DD HH:mm:ss')).toBe('2023-01-01 00:00:00');
expect(date.startOf('week', 'Europe/London').format('YYYY-MM-DD HH:mm:ss', 'America/New_York')).toBe('2022-12-31 19:00:00');
expect(date.startOf('week', 'America/New_York').format('YYYY-MM-DD HH:mm:ss', 'Europe/London')).toBe('2022-12-25 05:00:00');

expect(date.startOf('month', 'Europe/London').format('YYYY-MM-DD hh:mm:ss')).toBe('2023-01-01 00:00:00');
expect(date.startOf('month', 'Europe/London').format('YYYY-MM-DD hh:mm:ss', 'America/New_York')).toBe('2022-12-31 19:00:00');
expect(date.startOf('month', 'America/New_York').format('YYYY-MM-DD hh:mm:ss', 'Europe/London')).toBe('2022-12-01 05:00:00');
expect(date.startOf('month', 'Europe/London').format('YYYY-MM-DD HH:mm:ss')).toBe('2023-01-01 00:00:00');
expect(date.startOf('month', 'Europe/London').format('YYYY-MM-DD HH:mm:ss', 'America/New_York')).toBe('2022-12-31 19:00:00');
expect(date.startOf('month', 'America/New_York').format('YYYY-MM-DD HH:mm:ss', 'Europe/London')).toBe('2022-12-01 05:00:00');

expect(date.startOf('year', 'Europe/London').format('YYYY-MM-DD hh:mm:ss')).toBe('2023-01-01 00:00:00');
expect(date.startOf('year', 'Europe/London').format('YYYY-MM-DD hh:mm:ss', 'America/New_York')).toBe('2022-12-31 19:00:00');
expect(date.startOf('year', 'America/New_York').format('YYYY-MM-DD hh:mm:ss', 'Europe/London')).toBe('2022-01-01 05:00:00');
expect(date.startOf('year', 'Europe/London').format('YYYY-MM-DD HH:mm:ss')).toBe('2023-01-01 00:00:00');
expect(date.startOf('year', 'Europe/London').format('YYYY-MM-DD HH:mm:ss', 'America/New_York')).toBe('2022-12-31 19:00:00');
expect(date.startOf('year', 'America/New_York').format('YYYY-MM-DD HH:mm:ss', 'Europe/London')).toBe('2022-01-01 05:00:00');
});
});

2 changes: 1 addition & 1 deletion src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export const TimeUnits = {
MILLISECOND: 1,
} as const;

export const FORMAT_REGEX = /\[(?<escaped>[^\]]+)]|Y{4}|Y{2}|M{1,4}|D{1,2}|d{1,4}|h{1,2}|m{1,2}|s{1,2}/g;
export const FORMAT_REGEX = /\[(?<escaped>[^\]]+)]|Y{4}|Y{2}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|m{1,2}|s{1,2}|a|A/g;
export const MONTH_NAMES = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ];

export const RELATIVE_MAP: Record<number, string | ((milliseconds: number) => string)> = {
Expand Down
8 changes: 6 additions & 2 deletions src/time.ts
Original file line number Diff line number Diff line change
Expand Up @@ -210,8 +210,12 @@ export class HolyTime {
MMMM: MONTH_NAMES[date.getMonth()],
D: date.getDate().toString(),
DD: date.getDate().toString().padStart(2, '0'),
h: date.getHours().toString(),
hh: date.getHours().toString().padStart(2, '0'),
HH: date.getHours().toString().padStart(2, '0'),
H: date.getHours().toString(),
h: (date.getHours() % 12).toString(),
hh: (date.getHours() % 12).toString().padStart(2, '0'),
A: date.getHours() >= 12 ? 'PM' : 'AM',
a: date.getHours() >= 12 ? 'pm' : 'am',
m: date.getMinutes().toString(),
mm: date.getMinutes().toString().padStart(2, '0'),
s: date.getSeconds().toString(),
Expand Down

0 comments on commit c1d8714

Please sign in to comment.