Luxon
A powerful, modern, and friendly wrapper for JavaScript dates and times.
Features
- DateTimes, Durations, and Intervals
- Immutable, chainable, unambiguous API.
- Native time zone and Intl support (no locale or tz files)
Install
TypeScript 지원:
Formatting
Technical formats (strings for computers)
ISO 8601
ISO 8601 is the most widely used set of string formats for dates and times. Luxon can parse a wide range of them, but provides direct support for formatting only a few of them:
dt.toISO(); //=> '2017-04-20T11:32:00.000-04:00'
dt.toISODate(); //=> '2017-04-20'
dt.toISOWeekDate(); //=> '2017-W17-7'
dt.toISOTime(); //=> '11:32:00.000-04:00'
Generally, you'll want the first one. Use it by default when building or interacting with APIs, communicating times over a wire, etc.
HTTP and RFC 2822
There are a number of legacy standard date and time formats out there, and Luxon supports some of them. You shouldn't use them unless you have a specific reason to.
dt.toRFC2822(); //=> 'Thu, 20 Apr 2017 11:32:00 -0400'
dt.toHTTP(); //=> 'Thu, 20 Apr 2017 03:32:00 GMT'
Unix timestamps
DateTime objects can also be converted to numerical Unix timestamps:
dt.toMillis(); //=> 1492702320000
dt.toSeconds(); //=> 1492702320.000
dt.toUnixInteger(); // => 1492702320
dt.valueOf(); //=> 1492702320000, same as .toMillis()
toLocaleString (strings for humans)
The basics
Modern browsers (and other JS environments) provide support for human-readable, internationalized strings. Luxon provides convenient support for them, and you should use them anytime you want to display a time to a user. Use toLocaleString to do it:
dt.toLocaleString(); //=> '4/20/2017'
dt.toLocaleString(DateTime.DATETIME_FULL); //=> 'April 20, 2017 at 11:32 AM EDT'
dt.setLocale('fr').toLocaleString(DateTime.DATETIME_FULL); //=> '20 avril 2017 à 11:32 UTC−4'
Intl.DateTimeFormat
In the example above, DateTime.DATETIME_FULL is one of several convenience formats provided by Luxon. But the arguments are really any object of options that can be provided to Intl.DateTimeFormat. For example:
And that's all the preset is:
DateTime.DATETIME_FULL; //=> {
// year: 'numeric',
// month: 'long',
// day: 'numeric',
// hour: 'numeric',
// minute: '2-digit',
// timeZoneName: 'short'
// }
This also means you can modify the presets as you choose:
dt.toLocaleString(DateTime.DATE_SHORT); //=> '4/20/2017'
var newFormat = {...DateTime.DATE_SHORT, weekday: 'long' };
dt.toLocaleString(newFormat); //=> 'Thursday, 4/20/2017'
TimeZone 관련 예제
console.debug(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.debug(Intl.supportedValuesOf('timeZone'));
const date = DateTime.now();
console.debug(date.toISOTime({extendedZone: true}));
console.debug(date.setZone('America/New_York').toISOTime({extendedZone: true}));
console.debug(date.toFormat('ZZ'));
console.debug(date.setZone('America/New_York').toFormat('ZZ'));
console.debug(date.setZone('UTC-05:00').zone.name);
console.debug(date.setZone('UTC+05:00').zone.name);
console.debug(date.setZone('UTC').zone.name);
console.debug(date.setZone('GMT').zone.name);
console.debug(date.setZone('KST').zone.name);
Table of tokens
(Examples below given for 2014-08-06T13:07:04.054 considered as a local time in America/New_York).
Standalone token | Format token | Description | Example |
S | - | millisecond, no padding | 54 |
SSS | - | millisecond, padded to 3 | 054 |
u | - | fractional seconds, functionally identical to SSS | 054 |
uu | - | fractional seconds, between 0 and 99, padded to 2 | 05 |
uuu | - | fractional seconds, between 0 and 9 | 0 |
s | - | second, no padding | 4 |
ss | - | second, padded to 2 padding | 04 |
m | - | minute, no padding | 7 |
mm | - | minute, padded to 2 | 07 |
h | - | hour in 12-hour time, no padding | 1 |
hh | - | hour in 12-hour time, padded to 2 | 01 |
H | - | hour in 24-hour time, no padding | 9 |
HH | - | hour in 24-hour time, padded to 2 | 13 |
Z | - | narrow offset | +5 |
ZZ | - | short offset | +05:00 |
ZZZ | - | techie offset | +0500 |
ZZZZ | - | abbreviated named offset | EST |
ZZZZZ | - | unabbreviated named offset | Eastern Standard Time |
z | - | IANA zone | America/New_York |
a | - | meridiem | AM |
d | - | day of the month, no padding | 6 |
dd | - | day of the month, padded to 2 | 06 |
c | E | day of the week, as number from 1-7 (Monday is 1, Sunday is 7) | 3 |
ccc | EEE | day of the week, as an abbreviate localized string | Wed |
cccc | EEEE | day of the week, as an unabbreviated localized string | Wednesday |
ccccc | EEEEE | day of the week, as a single localized letter | W |
L | M | month as an unpadded number | 8 |
LL | MM | month as a padded number | 08 |
LLL | MMM | month as an abbreviated localized string | Aug |
LLLL | MMMM | month as an unabbreviated localized string | August |
LLLLL | MMMMM | month as a single localized letter | A |
y | - | year, unpadded | 2014 |
yy | - | two-digit year | 14 |
yyyy | - | four- to six- digit year, pads to 4 | 2014 |
G | - | abbreviated localized era | AD |
GG | - | unabbreviated localized era | Anno Domini |
GGGGG | - | one-letter localized era | A |
kk | - | ISO week year, unpadded | 14 |
kkkk | - | ISO week year, padded to 4 | 2014 |
W | - | ISO week number, unpadded | 32 |
WW | - | ISO week number, padded to 2 | 32 |
o | - | ordinal (day of year), unpadded | 218 |
ooo | - | ordinal (day of year), padded to 3 | 218 |
q | - | quarter, no padding | 3 |
| - | quarter, padded to 2 | 03 |
D | - | localized numeric date | 9/4/2017 |
DD | - | localized date with abbreviated month | Aug 6, 2014 |
DDD | - | localized date with full month | August 6, 2014 |
DDDD | - | localized date with full month and weekday | Wednesday, August 6, 2014 |
t | - | localized time | 9:07 AM |
tt | - | localized time with seconds | 1:07:04 PM |
ttt | - | localized time with seconds and abbreviated offset | 1:07:04 PM EDT |
tttt | - | localized time with seconds and full offset | 1:07:04 PM Eastern Daylight Time |
T | - | localized 24-hour time | 13:07 |
TT | - | localized 24-hour time with seconds | 13:07:04 |
TTT | - | localized 24-hour time with seconds and abbreviated offset | 13:07:04 EDT |
TTTT | - | localized 24-hour time with seconds and full offset | 13:07:04 Eastern Daylight Time |
f | - | short localized date and time | 8/6/2014, 1:07 PM |
ff | - | less short localized date and time | Aug 6, 2014, 1:07 PM |
fff | - | verbose localized date and time | August 6, 2014, 1:07 PM EDT |
ffff | - | extra verbose localized date and time | Wednesday, August 6, 2014, 1:07 PM Eastern Daylight Time |
F | - | short localized date and time with seconds | 8/6/2014, 1:07:04 PM |
FF | - | less short localized date and time with seconds | Aug 6, 2014, 1:07:04 PM |
FFF | - | verbose localized date and time with seconds | August 6, 2014, 1:07:04 PM EDT |
FFFF | - | extra verbose localized date and time with seconds | Wednesday, August 6, 2014, 1:07:04 PM Eastern Daylight Time |
X | - | unix timestamp in seconds | 1407287224 |
x | - | unix timestamp in milliseconds | 1407287224054 |
Example
로케일이 적용된 날짜를 텍스트로 출력하는 방법
import {DateTime} from 'luxon';
const originalData = '2023-02-28';
const zone = 'Asia/Seoul';
const locale = 'ko-KR';
const numberingSystem = 'latn';
const outputCalendar = 'number';
const dateTimeOptions = {locale, zone, numberingSystem, outputCalendar};
const datetime = DateTime.fromISO(originalData, dateTimeOptions);
const datetimeText = datetime.toLocaleString(DateTime.DATE_FULL);
console.debug(datetimeText);
Duration 계산 방법
- javascript - How to calculate a duration between two dates in luxon? - Stack Overflow
- javascript - How to format a Date with Luxon? - Stack Overflow
import {DateTime, Duration, DurationOptions} from 'luxon';
import {DurationLikeObject} from 'luxon/src/duration';
export const KO_KR_DURATION_OPTIONS = {
locale: 'ko-KR',
numberingSystem: 'latn',
outputCalendar: 'number',
} as DurationOptions;
export function durationMinutes(
start: string,
end: string,
options = KO_KR_DURATION_OPTIONS
) {
const startDateTime = DateTime.fromISO(start, options);
const endDateTime = DateTime.fromISO(end, options);
const duration = endDateTime.diff(startDateTime);
const durationObj = {
minutes: Math.floor(duration.as('minutes')), // duration.as('minutes') 계산 결과가 소수점으로 출력되므로 '정수형' 분 단위는 Math.floor 같은 소수점 제거를 같이 사용해야 한다.
} as DurationLikeObject;
const durationMinutes = Duration.fromObject(durationObj, options);
return durationMinutes.toHuman();
}