Skip to content

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

npm install --save luxon

TypeScript 지원:

npm install --save @types/luxon

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:

dt.toLocaleString({ month: 'long', day: 'numeric' }); //=> 'April 20'

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

qq

-

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 계산 방법

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();
}

See also

Favorite site