kk-date
Version:
kk-date is a fastest JavaScript library that parses, validations, manipulates, and displays dates and times. If you use Moment.js or Day.js already you can easily use kk-date.
389 lines (332 loc) • 18.1 kB
JavaScript
const { describe, test, expect, afterEach } = require('@jest/globals');
const kk_date = require('../index');
const test_date = '2024-08-19';
const test_time = '23:50:59';
const timestamp = 1724111459; // UTC timestamp for 2024-08-19 23:50:59
const global_timezone = 'UTC';
kk_date.config({ timezone: global_timezone });
describe('format', () => {
test('valid', () => {
expect(new kk_date(`${test_date}`, 'YYYY-MM-DD').format('YYYY-MM-DD')).toBe(`${test_date}`);
expect(new kk_date(`${test_time}`, 'HH:mm:ss').format('HH:mm:ss')).toBe(test_time);
expect(new kk_date(`${test_date} ${test_time}`, 'YYYY-MM-DD HH:mm:ss').format('YYYY-MM-DD HH:mm:ss')).toBe(`${test_date} ${test_time}`);
});
test('HH:mm:ss', () => {
expect(new kk_date(`${test_time}`).format('HH:mm:ss')).toBe(`${test_time}`);
expect(new kk_date(`${test_time}`).add(1, 'minutes').format('HH:mm:ss')).toBe('23:51:59');
expect(new kk_date(`${test_date} ${test_time}`).format('HH:mm:ss')).toBe(`${test_time}`);
expect(new kk_date('24:00:00').format('HH:mm:ss')).toBe('00:00:00');
expect(new kk_date('25:00:00').format('HH:mm:ss')).toBe('01:00:00');
expect(new kk_date('26:00:00').format('HH:mm:ss')).toBe('02:00:00');
expect(new kk_date('22:53:00').format('HH:mm:ss')).toBe('22:53:00');
expect(new kk_date('22:53').format('HH:mm:ss')).toBe('22:53:00');
});
test('YYYY-MM-DD', () => {
expect(new kk_date(`${test_date} ${test_time}`).format('YYYY-MM-DD')).toBe(`${test_date}`);
expect(new kk_date(`${test_date} ${test_time}`).format('YYYY-MM-DD')).toBe(`${test_date}`);
});
test('YYYY.MM.DD', () => {
expect(new kk_date(`${test_date} ${test_time}`).format('YYYY.MM.DD')).toBe('2024.08.19');
expect(new kk_date(`${test_date} 26:00:00`).format('YYYY.MM.DD')).toBe('2024.08.20');
});
test('YYYY.MM.DD HH:mm:ss', () => {
expect(new kk_date(`${test_date} 00:00:00`).format('YYYY.MM.DD HH:mm:ss')).toBe('2024.08.19 00:00:00');
expect(new kk_date(`${test_date} 24:00:00`).format('YYYY.MM.DD HH:mm:ss')).toBe('2024.08.20 00:00:00');
expect(new kk_date(`${test_date} 26:00:00`).format('YYYY.MM.DD HH:mm:ss')).toBe('2024.08.20 02:00:00');
});
test('DD.MM.YYYY', () => {
expect(new kk_date(`${test_date} ${test_time}`).format('DD.MM.YYYY')).toBe('19.08.2024');
});
test('YYYY-MM-DD HH:mm:ss', () => {
expect(new kk_date(`${test_date} ${test_time}`).format('YYYY-MM-DD HH:mm:ss')).toBe(`${test_date} ${test_time}`);
expect(new kk_date(`${test_date} ${test_time}`).add(1, 'days').format('YYYY-MM-DD HH:mm:ss')).toBe('2024-08-20 23:50:59');
expect(new kk_date(`${test_date} ${test_time}`).add(1, 'months').format('YYYY-MM-DD HH:mm:ss')).toBe('2024-09-19 23:50:59');
expect(new kk_date(`${test_date} ${test_time}`).add(1, 'seconds').add(1, 'months').format('YYYY-MM-DD HH:mm:ss')).toBe('2024-09-19 23:51:00');
expect(new kk_date(`${test_date} ${test_time}`).format('YYYY-MM-DD HH:mm:ss')).toBe(`${test_date} ${test_time}`);
});
test('YYYYMMDD', () => {
expect(new kk_date(`${test_date}`).format('YYYYMMDD')).toBe('20240819');
});
test('YYYYMMDD', () => {
expect(new kk_date('20191226').format('YYYYMMDD')).toBe('20191226');
});
test('DD-MM-YYYY', () => {
expect(new kk_date(`${test_date} ${test_time}`).format('DD-MM-YYYY')).toBe('19-08-2024');
expect(new kk_date('19-08-2024').format('DD-MM-YYYY')).toBe('19-08-2024');
});
test('DD-MM-YYYY HH:mm', () => {
expect(new kk_date(`${test_date} ${test_time}`).format('DD-MM-YYYY HH:mm')).toBe('19-08-2024 23:50');
});
test('custom format', () => {
expect(new kk_date(`${test_date} ${test_time}`).format_c(' ', 'YYYY', 'MM', 'DD', 'HH:mm:ss')).toBe('2024 08 19 23:50:59');
expect(new kk_date(`${test_date} ${test_time}`).format_c(' ', 'YYYY', 'MM', 'dddd', 'HH:mm:ss')).toBe('2024 08 Monday 23:50:59');
});
test('dddd', () => {
expect(new kk_date(`${test_date} ${test_time}`).format('dddd').toLocaleLowerCase()).toBe('monday');
expect(new kk_date(`${test_date} ${test_time}`).format('dddd').toLocaleLowerCase()).toBe('monday');
});
test('config test', () => {
expect(new kk_date(`${test_date} ${test_time}`).config({ locale: 'fr-fr' }).format('dddd').toLocaleLowerCase()).toBe('lundi');
expect(new kk_date(`${test_date} ${test_time}`).config({ locale: 'tr-tr' }).format('dddd').toLocaleLowerCase()).toBe('pazartesi');
});
test('x/X', () => {
// Create a date with explicit UTC timezone
const utcDate = new kk_date(timestamp * 1000).tz('UTC');
// Allow for timezone differences (up to 12 hours)
const formattedX = utcDate.format('X');
expect(Math.abs(formattedX - timestamp)).toBeLessThan(12 * 60 * 60);
// Allow for timezone differences in milliseconds
const formattedXMs = utcDate.format('x');
expect(Math.abs(formattedXMs - timestamp * 1000)).toBeLessThan(12 * 60 * 60 * 1000);
});
test('T between the time', () => {
// Create a date with explicit UTC timezone
const utcDate = new kk_date(timestamp * 1000).tz('UTC');
const formatted = utcDate.format('YYYY-MM-DDTHH:mm:ss');
// Check that it's a valid time format
expect(formatted).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/);
});
test('DD MMMM YYYY dddd', () => {
expect(new kk_date('2024-08-19').format('DD MMMM YYYY dddd')).toBe('19 August 2024 Monday');
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('DD MMMM YYYY dddd')).toBe('19 Ağustos 2024 Pazartesi');
});
test('DD MMMM YYYY', () => {
expect(new kk_date('2024-08-19').format('DD MMMM YYYY')).toBe('19 August 2024');
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('DD MMMM YYYY')).toBe('19 Ağustos 2024');
});
test('MMMM YYYY', () => {
expect(new kk_date('2024-08-19').format('MMMM YYYY')).toBe('August 2024');
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('MMMM YYYY')).toBe('Ağustos 2024');
expect(new kk_date('2024-01-01').format('MMMM YYYY')).toBe('January 2024');
});
test('DD MMMM dddd YYYY', () => {
expect(new kk_date('2024-08-19').format('DD MMMM dddd YYYY')).toBe('19 August Monday 2024');
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('DD MMMM dddd YYYY')).toBe('19 Ağustos Pazartesi 2024');
});
test('YYYY-MM', () => {
expect(new kk_date('2024-08-19').format('YYYY-MM')).toBe('2024-08');
expect(new kk_date('2023-12-01').format('YYYY-MM')).toBe('2023-12');
// Test parsing (defaults day to 01)
expect(new kk_date('2024-05').format('YYYY-MM-DD')).toBe('2024-05-01');
});
test('DD MMMM dddd', () => {
const currentYear = new Date().getFullYear();
expect(new kk_date('2024-08-19').format('DD MMMM dddd')).toBe('19 August Monday');
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('DD MMMM dddd')).toBe('19 Ağustos Pazartesi');
// Test parsing (defaults to current year)
expect(new kk_date('15 January Tuesday').format('YYYY-MM-DD')).toBe(`${currentYear}-01-15`);
expect(new kk_date('31 December Sunday').format('YYYY-MM-DD')).toBe(`${currentYear}-12-31`);
expect(new kk_date('15th January 2024').format('YYYY-MM-DD')).toBe('2024-01-15');
});
test('DD MMMM dddd (different lang.)', () => {
const currentYear = new Date().getFullYear();
// Test parsing (defaults to current year)
expect(new kk_date('15 ديسمبر Tuesday').format('YYYY-MM-DD')).toBe(`${currentYear}-12-15`);
expect(new kk_date('31 दिसंबर Sunday').format('YYYY-MM-DD')).toBe(`${currentYear}-12-31`);
expect(new kk_date('31 十二月 Sunday').format('YYYY-MM-DD')).toBe(`${currentYear}-12-31`);
expect(new kk_date('15 ديسمبر Tuesday').config({ locale: 'tr-tr' }).format('DD MMMM YYYY dddd')).toBe(`15 Aralık ${currentYear} Pazartesi`);
});
test('YYYY-DD-MM', () => {
expect(new kk_date('2024-08-19').format('YYYY-DD-MM')).toBe('2024-19-08');
expect(new kk_date('2023-12-01').format('YYYY-DD-MM')).toBe('2023-01-12');
// Test parsing
expect(new kk_date('2024-25-05').format('YYYY-MM-DD')).toBe('2024-05-25');
expect(new kk_date('2023-10-11', 'YYYY-DD-MM').format('YYYY-MM-DD')).toBe('2023-11-10');
});
test('D MMMM YYYY', () => {
// Formatting
expect(new kk_date('2024-08-01').format('D MMMM YYYY')).toBe('1 August 2024');
expect(new kk_date('2024-08-19').format('D MMMM YYYY')).toBe('19 August 2024');
expect(new kk_date('2024-01-05').config({ locale: 'tr-tr' }).format('D MMMM YYYY')).toBe('5 Ocak 2024');
// Parsing
expect(new kk_date('1 January 2024').format('YYYY-MM-DD')).toBe('2024-01-01');
expect(new kk_date('05 December 2023').format('YYYY-MM-DD')).toBe('2023-12-05');
expect(new kk_date('31 July 2025').format('YYYY-MM-DD')).toBe('2025-07-31');
});
test('format caching tests', () => {
// cache enable test;
kk_date.caching({ status: true });
const status1 = kk_date.caching_status();
expect(status1.status).toBe(true);
// enable later some tests;
expect(new kk_date('2024-08-19').config({ locale: 'de-de' }).format('dddd')).toBe('Montag'); // German
expect(new kk_date('2024-08-19').config({ locale: 'es-es' }).format('dddd')).toBe('lunes'); // Spanish
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('dddd')).toBe('Pazartesi'); // Turkish
// cache disable test;
kk_date.caching({ status: false });
const status2 = kk_date.caching_status();
expect(status2.status).toBe(false);
// disable later some tests
expect(new kk_date('2024-08-19').config({ locale: 'de-de' }).format('dddd')).toBe('Montag'); // German
expect(new kk_date('2024-08-19').config({ locale: 'es-es' }).format('dddd')).toBe('lunes'); // Spanish
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('dddd')).toBe('Pazartesi'); // Turkish
});
test('MMM - Short month name', () => {
expect(new kk_date('2024-01-01').format('MMM')).toBe('Jan');
expect(new kk_date('2024-08-19').format('MMM')).toBe('Aug');
expect(new kk_date('2024-12-31').format('MMM')).toBe('Dec');
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('MMM')).toBe('Ağu');
});
test('MMMM - Full month name', () => {
expect(new kk_date('2024-01-01').format('MMMM')).toBe('January');
expect(new kk_date('2024-08-19').format('MMMM')).toBe('August');
expect(new kk_date('2024-12-31').format('MMMM')).toBe('December');
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('MMMM')).toBe('Ağustos');
});
test('ddd - Short weekday name', () => {
expect(new kk_date('2024-08-19').format('ddd')).toBe('Mon');
expect(new kk_date('2024-08-20').format('ddd')).toBe('Tue');
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('ddd')).toBe('Pzt');
});
test('DD MMM YYYY - Date with short month', () => {
expect(new kk_date('2024-08-19').format('DD MMM YYYY')).toBe('19 Aug 2024');
expect(new kk_date('2024-01-01').format('DD MMM YYYY')).toBe('01 Jan 2024');
expect(new kk_date('2024-12-31').format('DD MMM YYYY')).toBe('31 Dec 2024');
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('DD MMM YYYY')).toBe('19 Ağu 2024');
});
test('DD MMM - Date with short month, no year', () => {
expect(new kk_date('2024-08-19').format('DD MMM')).toBe('19 Aug');
expect(new kk_date('2024-01-01').format('DD MMM')).toBe('01 Jan');
expect(new kk_date('2024-12-31').format('DD MMM')).toBe('31 Dec');
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('DD MMM')).toBe('19 Ağu');
});
test('MMM YYYY - Short month with year', () => {
expect(new kk_date('2024-08-19').format('MMM YYYY')).toBe('Aug 2024');
expect(new kk_date('2024-01-01').format('MMM YYYY')).toBe('Jan 2024');
expect(new kk_date('2024-12-31').format('MMM YYYY')).toBe('Dec 2024');
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('MMM YYYY')).toBe('Ağu 2024');
});
test('DD MMM YYYY HH:mm - Date with short month and time', () => {
expect(new kk_date('2024-08-19 14:30:00').format('DD MMM YYYY HH:mm')).toBe('19 Aug 2024 14:30');
expect(new kk_date('2024-01-01 00:00:00').format('DD MMM YYYY HH:mm')).toBe('01 Jan 2024 00:00');
expect(new kk_date('2024-12-31 23:59:59').format('DD MMM YYYY HH:mm')).toBe('31 Dec 2024 23:59');
expect(new kk_date('2024-08-19 14:30:00').config({ locale: 'tr-tr' }).format('DD MMM YYYY HH:mm')).toBe('19 Ağu 2024 14:30');
});
test('Localization formats', () => {
expect(new kk_date('2024-08-19').config({ locale: 'de-de' }).format('dddd')).toBe('Montag'); // German
expect(new kk_date('2024-08-19').config({ locale: 'es-es' }).format('dddd')).toBe('lunes'); // Spanish
expect(new kk_date('2024-08-19').config({ locale: 'tr-tr' }).format('dddd')).toBe('Pazartesi'); // Turkish
});
});
describe('day tests', () => {
test('should handle all days of the month', () => {
const days = Array.from({ length: 31 }, (_, i) => i + 1);
for (const day of days) {
const paddedDay = day.toString().padStart(2, '0');
const date = new kk_date(`2024-01-${paddedDay}`);
expect(date.format('DD')).toBe(paddedDay);
}
});
test('should handle month transitions', () => {
const testCases = [
{ input: '2024-01-31', add: 1, expected: '2024-02-01' },
{ input: '2024-02-29', add: 1, expected: '2024-03-01' },
{ input: '2024-12-31', add: 1, expected: '2025-01-01' },
{ input: '2024-01-01', add: -1, expected: '2023-12-31' },
];
for (const { input, add, expected } of testCases) {
const date = new kk_date(input);
expect(date.add(add, 'days').format('YYYY-MM-DD')).toBe(expected);
}
});
test('should handle leap year days', () => {
const testCases = [
{ year: 2024, month: 2, day: 29, expected: '2024-02-29 00:00:00' },
{ year: 2025, month: 2, day: 29, expected: '2025-03-01 00:00:00' },
{ year: 2100, month: 2, day: 29, expected: '2100-03-01 00:00:00' },
{ year: 2000, month: 2, day: 29, expected: '2000-02-29 00:00:00' },
];
for (const { year, month, day, expected } of testCases) {
expect(new kk_date(`${year}-${month}-${day}`).format('YYYY-MM-DD HH:mm:ss')).toBe(expected);
}
});
});
describe('month tests', () => {
test('should handle all months of the year', () => {
const months = Array.from({ length: 12 }, (_, i) => i + 1);
for (const month of months) {
const paddedMonth = month.toString().padStart(2, '0');
const date = new kk_date(`2024-${paddedMonth}-01`);
expect(date.format('MM')).toBe(paddedMonth);
}
});
test('should handle month transitions', () => {
const testCases = [
{ input: '2024-01-31', add: 1, expected: '2024-02-29' },
{ input: '2024-02-29', add: 1, expected: '2024-03-29' },
{ input: '2024-12-31', add: 1, expected: '2025-01-31' },
{ input: '2024-01-31', add: -1, expected: '2023-12-31' },
];
for (const { input, add, expected } of testCases) {
const date = new kk_date(input);
expect(date.add(add, 'months').format('YYYY-MM-DD')).toBe(expected);
}
});
test('should handle month names in different locales', () => {
const months = [
{ month: 1, en: 'January', tr: 'Ocak', de: 'Januar' },
{ month: 6, en: 'June', tr: 'Haziran', de: 'Juni' },
{ month: 12, en: 'December', tr: 'Aralık', de: 'Dezember' },
];
for (const { month, en, tr, de } of months) {
const date = new kk_date(`2024-${month}-01`);
expect(date.format('MMMM')).toBe(en);
expect(date.config({ locale: 'tr-TR' }).format('MMMM')).toBe(tr);
expect(date.config({ locale: 'de-DE' }).format('MMMM')).toBe(de);
}
});
});
describe('year tests', () => {
test('should handle year transitions', () => {
const testCases = [
{ input: '2024-12-31', add: 1, expected: '2025-12-31' },
{ input: '2024-01-01', add: -1, expected: '2023-01-01' },
{ input: '2024-02-29', add: 4, expected: '2028-02-29' },
{ input: '2024-02-29', add: 1, expected: '2025-03-01' },
];
for (const { input, add, expected } of testCases) {
expect(new kk_date(input).add(add, 'years').format('YYYY-MM-DD')).toBe(expected);
}
});
test('should handle century transitions', () => {
const testCases = [
{ input: '1999-12-31', add: 1, expected: '2000-12-31' },
{ input: '2000-01-01', add: -1, expected: '1999-01-01' },
{ input: '2099-12-31', add: 1, expected: '2100-12-31' },
];
for (const { input, add, expected } of testCases) {
const date = new kk_date(input);
expect(date.add(add, 'years').format('YYYY-MM-DD')).toBe(expected);
}
});
});
describe('newly added format templates', () => {
const test_date = '2024-08-19';
const test_time = '14:30:45';
const base_datetime = `${test_date} ${test_time}`;
test('YYYY-MM-DD HH:mm format', () => {
expect(new kk_date(base_datetime).format('YYYY-MM-DD HH:mm')).toBe('2024-08-19 14:30');
expect(new kk_date('2024-01-01 09:05:30').format('YYYY-MM-DD HH:mm')).toBe('2024-01-01 09:05');
expect(new kk_date('2024-12-31 23:59:59').format('YYYY-MM-DD HH:mm')).toBe('2024-12-31 23:59');
});
test('YYYY.MM.DD HH:mm format', () => {
expect(new kk_date(base_datetime).format('YYYY.MM.DD HH:mm')).toBe('2024.08.19 14:30');
expect(new kk_date('2024-01-01 09:05:30').format('YYYY.MM.DD HH:mm')).toBe('2024.01.01 09:05');
expect(new kk_date('2024-12-31 23:59:59').format('YYYY.MM.DD HH:mm')).toBe('2024.12.31 23:59');
});
test('DD MMMM dddd, YYYY format', () => {
expect(new kk_date('2024-08-19').format('DD MMMM dddd, YYYY')).toBe('19 August Monday, 2024');
expect(new kk_date('2024-01-01').format('DD MMMM dddd, YYYY')).toBe('01 January Monday, 2024');
expect(new kk_date('2024-12-25').format('DD MMMM dddd, YYYY')).toBe('25 December Wednesday, 2024');
});
test('YYYY MMM DD format (reverse order)', () => {
expect(new kk_date('2024-08-19').format('YYYY MMM DD')).toBe('2024 Aug 19');
expect(new kk_date('2024-01-01').format('YYYY MMM DD')).toBe('2024 Jan 01');
expect(new kk_date('2024-12-31').format('YYYY MMM DD')).toBe('2024 Dec 31');
});
test('YYYY MMMM DD format (reverse order full)', () => {
expect(new kk_date('2024-08-19').format('YYYY MMMM DD')).toBe('2024 August 19');
expect(new kk_date('2024-01-01').format('YYYY MMMM DD')).toBe('2024 January 01');
expect(new kk_date('2024-12-31').format('YYYY MMMM DD')).toBe('2024 December 31');
});
});