2P by neo 29일전 | ★ favorite | 댓글 1개
  • JavaScript Temporal 릴리즈 시작

    • 새로운 JavaScript Temporal 객체의 구현이 브라우저의 실험적 릴리스에 포함되기 시작함. 이는 웹 개발자들에게 큰 소식이며, JavaScript에서 날짜와 시간을 다루는 것이 크게 간소화되고 현대화될 것임.
    • 일정 관리, 국제화, 시간 민감 데이터에 의존하는 애플리케이션은 내장 기능을 사용하여 효율적이고 정확하며 일관된 날짜, 시간, 기간, 캘린더를 사용할 수 있음.
    • 아직 안정적인 크로스 브라우저 지원까지는 멀었으며, 구현이 발전함에 따라 변경이 있을 수 있지만, 현재의 Temporal을 살펴보고 그 이유와 해결하는 문제를 이해할 수 있음.
    • MDN에 이번 주에 추가된 270페이지 이상의 Temporal 문서가 있으며, 자세한 설명과 예제가 포함되어 있음.
  • JavaScript Temporal이란?

    • Temporal을 이해하기 위해 JavaScript의 Date 객체를 살펴볼 수 있음. JavaScript가 1995년에 만들어졌을 때, Date 객체는 Java의 초기 결함 있는 java.util.Date 구현에서 복사됨.
    • Java는 1997년에 이 구현을 교체했지만, JavaScript는 거의 30년 동안 동일한 API에 갇혀 있음.
    • JavaScript의 Date 객체의 주요 문제는 사용자의 로컬 시간과 UTC만 지원하며, 시간대 지원이 없다는 것임. 또한, 파싱 동작이 매우 신뢰할 수 없고, Date 자체가 변경 가능하여 추적하기 어려운 버그를 유발할 수 있음.
    • 이러한 모든 문제로 인해 JavaScript에서 날짜와 시간을 다루는 것이 복잡하고 버그가 발생하기 쉬움. 대부분의 개발자는 Moment.js 및 date-fns와 같은 라이브러리에 의존하여 애플리케이션에서 날짜와 시간을 더 잘 처리함.
    • Temporal은 Date 객체를 완전히 대체하도록 설계되어 날짜 및 시간 관리를 신뢰할 수 있고 예측 가능하게 만듦. Temporal은 시간대 및 캘린더 표현을 지원하고, 변환, 비교 및 계산, 포맷팅 등을 위한 많은 내장 메서드를 추가함.
  • 핵심 개념

    • Temporal에서의 핵심 개념은 인스턴트(역사의 고유한 지점), 벽시계 시간(지역 시간), 기간임. API는 이러한 개념을 처리하기 위해 다음과 같은 구조를 가짐:
      • 기간: Temporal.Duration 두 시간 지점 간의 차이
      • 시간 지점:
        • 고유한 시간 지점:
          • 타임스탬프로서: Temporal.Instant
          • 시간대가 있는 날짜-시간: Temporal.ZonedDateTime
        • 시간대에 무관한 날짜/시간 ("Plain"):
          • 전체 날짜 및 시간: Temporal.PlainDateTime
          • 날짜만: Temporal.PlainDate
          • 연도 및 월: Temporal.PlainYearMonth
          • 월 및 일: Temporal.PlainMonthDay
          • 시간만: Temporal.PlainTime
      • 현재: 다양한 클래스 인스턴스 또는 특정 형식으로 현재 시간을 얻기 위해 Temporal.now 사용
  • Temporal 예제

    • Temporal의 가장 기본적인 사용법 중 일부는 ISO 문자열로 현재 날짜와 시간을 얻는 것임. 이제 많은 메서드에서 시간대를 제공할 수 있으며, 이는 복잡한 계산을 스스로 수행할 필요가 없게 함.
    • 다양한 캘린더와 작업하는 것도 간소화되어, 그레고리력 외의 캘린더 시스템(예: 히브리어, 중국어, 이슬람)에서 날짜를 생성할 수 있음.
    • Unix 타임스탬프와 작업하는 것은 많은 시스템(API, 데이터베이스)에서 시간을 나타내기 위해 형식을 사용하기 때문에 매우 일반적인 사용 사례임.
    • compare() 메서드는 기간을 우아하고 효율적으로 정렬할 수 있게 함.
  • Temporal 시도 및 브라우저 지원

    • 지원은 실험적 브라우저 릴리스에 천천히 포함되기 시작했으며, Firefox가 현재 가장 성숙한 구현을 가지고 있음.
    • Firefox에서는 Temporal이 javascript.options.experimental.temporal 환경 설정 뒤에 있는 Nightly 버전에 내장되고 있음.
    • 실험적 구현이 도입되면서, Temporal을 시도하고 JavaScript에서 날짜와 시간을 처리하는 현대적인 접근 방식을 익힐 좋은 시기임.
  • 감사의 말

    • Eric Meyer에게 주제에 대한 작업에 감사함. Eric이 mdn/content의 포크에서 브라우저 호환성 데이터를 문서화하고 문서를 구성한 지 약 4년이 지남.
    • Joshua Chen이 Eric으로부터 바통을 이어받아 MDN 문서에 대한 풀 리퀘스트를 준비함.
    • André Bargull이 Firefox Temporal 구현에 대한 작업에 감사함.
Hacker News 의견
  • Temporal은 기존 Date() API의 문제를 해결하는 데 유용함. Rust의 chrono와 Java의 Joda Time과 같은 고품질 시간 라이브러리에서 영감을 받아 편리한 API를 제공함

    • 시간은 복잡하며, Temporal은 이를 나이브 시간, 인스턴트, 존드 시간으로 구분하여 처리함
    • 타임스탬프에 하루를 더하는 작업을 할 때, 특정 시간대에 로컬인지 결정해야 함. 그렇지 않으면 DST나 시간대 변경 시 버그가 발생할 수 있음
    • "고정 오프셋" 타임스탬프와 특정 시간대의 타임스탬프 간의 직렬화 문제도 해결함
  • Temporal.ZonedDateTime.prototype.withTimeZone()를 사용하여 시간대를 변환할 수 있음

    • 시간대 변환과 지속 시간 처리는 라이브러리가 처리해야 할 중요한 기능이며, Temporal이 이를 처리함
    • 그러나 Temporal.Duration은 사용자 정의 format 함수를 제공하지 않음
  • Temporal 제안은 좋지만, 비교 시 참조 동등성을 사용하는 점이 아쉬움

    • 이는 객체를 Map 키로 사용하거나 Set에 수집하는 기능을 제거함
  • TC39에서 많은 기능이 개발 중이며, Temporal이 빨리 출시되기를 바람

    • 주요 브라우저가 새로운 기능을 지원하려면 개발 노력이 필요함
  • Temporal의 시간대 데이터 업데이트 방식에 대한 궁금증이 있음

    • 사용자가 브라우저를 업데이트하지 않으면 잘못된 시간을 볼 수 있음
  • 시간대 변경 시 이벤트를 추가해야 한다고 제안함

    • 많은 사람들이 매일 시간대를 이동함
  • Temporal이라는 이름이 일반적인 시간 객체와의 충돌을 피하기 위해 사용되었지만, 처음에는 쓰레기 수집 제어로 오해할 수 있음

  • PHP의 Carbon 클래스는 DateTime에서 상속받아 가변 타임스탬프 작업의 문제를 설명함

    • CarbonImmutable을 사용하여 항상 새로운 인스턴스를 반환하는 것이 좋음
    • Laravel에서 CarbonImmutable과 Carbon을 별칭으로 가져오는 방법을 제안함
  • JavaScript Temporal과 관련된 다양한 기사와 논의가 있음