페이지 표시 설정

21 숫자와 날짜

21.1 Number 객체

21.1.1 Number 생성자

Number 생성자는:

  • %Number%입니다.
  • 전역 객체의 "Number" 프로퍼티 초기 값입니다.
  • 생성자로 호출되면 새로운 Number 객체를 생성하고 초기화합니다.
  • 생성자가 아니라 함수로 호출되면 타입 변환을 수행합니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 명시된 Number 동작을 상속하려는 하위 클래스 생성자는 [[NumberData]] 내부 슬롯을 갖는 하위 클래스 인스턴스를 생성하고 초기화하기 위해 Number 생성자에 대한 super 호출을 포함해야 합니다.

21.1.1.1 Number ( value )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. value가 존재하면, 다음을 수행합니다.
    1. primitive를 ? ToNumeric(value)으로 둡니다.
    2. primitive가 BigInt이면 n을 𝔽(ℝ(primitive))로 둡니다.
    3. 그렇지 않으면 n을 primitive로 둡니다.
  2. 그렇지 않으면,
    1. n을 +0𝔽으로 둡니다.
  3. NewTarget이 undefined이면 n을 반환합니다.
  4. obj를 ? OrdinaryCreateFromConstructor(NewTarget, "%Number.prototype%", « [[NumberData]] »)로 둡니다.
  5. obj.[[NumberData]]를 n으로 설정합니다.
  6. obj를 반환합니다.

21.1.2 Number 생성자의 프로퍼티

Number 생성자는:

  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 다음 프로퍼티를 갖습니다:

21.1.2.1 Number.EPSILON

Number.EPSILON의 값은 1과 Number 값으로 표현할 수 있는 1보다 큰 가장 작은 값의 차이의 크기에 해당하는 Number 값이며, 약 2.2204460492503130808472633361816 × 10-16입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

21.1.2.2 Number.isFinite ( number )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. number가 유한 Number이면 true를 반환합니다.
  2. false를 반환합니다.

21.1.2.3 Number.isInteger ( number )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. number가 정수 Number이면 true를 반환합니다.
  2. false를 반환합니다.

21.1.2.4 Number.isNaN ( number )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. number가 Number가 아니면 false를 반환합니다.
  2. number가 NaN이면 true를 반환합니다.
  3. false를 반환합니다.
참고

이 함수는 인수가 NaN인지 판별하기 전에 인수를 Number로 변환하지 않는다는 점에서 전역 isNaN 함수(19.2.3)와 다릅니다.

21.1.2.5 Number.isSafeInteger ( number )

참고

정수 n에 대한 Number 값이 다른 어떤 정수에 대한 Number 값도 아닌 경우에만 정수 n을 “안전한 정수”라고 합니다.

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. number가 정수 Number이면 다음을 수행합니다.
    1. abs(ℝ(number)) ≤ 253 - 1이면 true를 반환합니다.
  2. false를 반환합니다.

21.1.2.6 Number.MAX_SAFE_INTEGER

참고

IEEE 754-2019의 정밀도 제한으로 인해 필요한 반올림 동작 때문에 Number.MAX_SAFE_INTEGER보다 큰 모든 정수에 대한 Number 값은 적어도 하나의 다른 정수와 공유됩니다. 따라서 이러한 큰 크기의 정수는 안전하지 않으며, Number 값으로 정확히 표현될 수 있거나 서로 구별될 수 있다고 보장되지 않습니다. 예를 들어 9007199254740992와 9007199254740993은 모두 Number 값 9007199254740992𝔽로 평가됩니다.

Number.MAX_SAFE_INTEGER의 값은 9007199254740991𝔽 (𝔽(253 - 1))입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.1.2.7 Number.MAX_VALUE

Number.MAX_VALUE의 값은 가장 큰 양의 유한 Number이며, 대략 1.7976931348623157 × 10308입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.1.2.8 Number.MIN_SAFE_INTEGER

참고

IEEE 754-2019의 정밀도 제한으로 인해 필요한 반올림 동작 때문에 Number.MIN_SAFE_INTEGER보다 작은 모든 정수에 대한 Number 값은 적어도 하나의 다른 정수와 공유됩니다. 따라서 이러한 큰 크기의 정수는 안전하지 않으며, Number 값으로 정확히 표현될 수 있거나 서로 구별될 수 있다고 보장되지 않습니다. 예를 들어 -9007199254740992와 -9007199254740993은 모두 Number 값 -9007199254740992𝔽로 평가됩니다.

Number.MIN_SAFE_INTEGER의 값은 -9007199254740991𝔽 (𝔽(-(253 - 1)))입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.1.2.9 Number.MIN_VALUE

Number.MIN_VALUE의 값은 Number 타입의 가장 작은 양의 값이며, 대략 5 × 10-324입니다.

IEEE 754-2019 배정밀도 이진 표현에서 가능한 가장 작은 값은 비정규화된 수입니다. 구현이 비정규화된 값을 지원하지 않는 경우 Number.MIN_VALUE의 값은 구현에서 실제로 표현할 수 있는 가장 작은 0이 아닌 양의 값이어야 합니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.1.2.10 Number.NaN

Number.NaN의 값은 NaN입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.1.2.11 Number.NEGATIVE_INFINITY

Number.NEGATIVE_INFINITY의 값은 -∞𝔽입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.1.2.12 Number.parseFloat ( string )

"parseFloat" 속성의 초기값은 %parseFloat%입니다.

21.1.2.13 Number.parseInt ( string, radix )

"parseInt" 속성의 초기값은 %parseInt%입니다.

21.1.2.14 Number.POSITIVE_INFINITY

Number.POSITIVE_INFINITY의 값은 +∞𝔽입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.1.2.15 Number.prototype

Number.prototype의 초기값은 Number 프로토타입 객체입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.1.3 Number 프로토타입 객체의 속성

Number 프로토타입 객체는 다음과 같습니다:

  • %Number.prototype%입니다.
  • 일반 객체입니다.
  • 그 자체가 Number 객체이며, 값이 +0𝔽인 [[NumberData]] 내부 슬롯을 가집니다.
  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 가집니다.

명시적으로 달리 언급되지 않는 한, 아래에 정의된 Number 프로토타입 객체의 메서드는 제네릭이 아니며, 해당 메서드에 전달되는 this 값은 Number 값 또는 Number 값으로 초기화된 [[NumberData]] 내부 슬롯을 가진 객체여야 합니다.

메서드 명세에서 “이 Number 값”이라는 구문은 메서드 호출의 this 값을 인수로 전달하여 추상 연산 ThisNumberValue를 호출했을 때 반환되는 결과를 가리킵니다.

21.1.3.1 Number.prototype.constructor

Number.prototype.constructor의 초기값은 %Number%입니다.

21.1.3.2 Number.prototype.toExponential ( fractionDigits )

이 메서드는 이 Number 값을 유효숫자의 소수점 앞에 한 자리, 유효숫자의 소수점 뒤에 fractionDigits자리 숫자가 있는 십진 지수 표기법으로 나타낸 String을 반환합니다. fractionDigits가 undefined이면 Number를 고유하게 지정하는 데 필요한 만큼의 유효숫자를 포함합니다(ToString과 같지만 이 경우 Number는 항상 지수 표기법으로 출력됩니다).

호출될 때 다음 단계를 수행합니다:

  1. number를 ? ThisNumberValue(this 값)으로 둡니다.
  2. fractionCount를 ? ToIntegerOrInfinity(fractionDigits)로 둡니다.
  3. 단언: fractionDigits가 undefined이면 fractionCount는 0입니다.
  4. number가 유한 Number가 아니면 Number::toString(number, 10)을 반환합니다.
  5. fractionCount가 정수가 아니면 RangeError 예외를 던집니다.
  6. fractionCount < 0 또는 fractionCount > 100이면 RangeError 예외를 던집니다.
  7. number를 ℝ(number)로 설정합니다.
  8. sign을 빈 String으로 둡니다.
  9. number < 0이면 다음을 수행합니다.
    1. sign을 "-"로 설정합니다.
    2. number를 -number로 설정합니다.
  10. number = 0이면 다음을 수행합니다.
    1. significand를 코드 단위 0x0030 (DIGIT ZERO)이 fractionCount + 1회 나타나는 String 값으로 둡니다.
    2. exponent를 0으로 둡니다.
  11. 그렇지 않으면,
    1. fractionDigits가 undefined가 아니면 다음을 수행합니다.
      1. exponent와 intSignificand를 10fractionCount ≤ intSignificand < 10fractionCount + 1이고 intSignificand × 10exponent - fractionCount - number가 가능한 한 0에 가까워지는 정수로 둡니다. 이러한 exponent와 intSignificand의 쌍이 두 개 있으면 intSignificand × 10exponent - fractionCount가 더 큰 exponent와 intSignificand를 선택합니다.
    2. 그렇지 않으면,
      1. exponent, intSignificand, ff를 ff ≥ 0, 10ff ≤ intSignificand < 10ff + 1, 𝔽(intSignificand × 10exponent - ff)가 𝔽(number)이고 ff가 가능한 한 작은 정수로 둡니다. intSignificand의 십진 표현은 ff + 1자리 숫자를 가지며, intSignificand는 10으로 나누어떨어지지 않고, intSignificand의 최하위 숫자가 이러한 기준에 의해 반드시 고유하게 결정되는 것은 아니라는 점에 유의하십시오.
      2. fractionCount를 ff로 설정합니다.
    3. significand를 intSignificand의 십진 표현 숫자들로 구성된 String 값으로 둡니다(순서대로, 선행 0 없이).
  12. fractionCount ≠ 0이면 다음을 수행합니다.
    1. intPart를 significand의 첫 번째 코드 단위로 둡니다.
    2. fractionalPart를 significand의 나머지 fractionCount개 코드 단위로 둡니다.
    3. significand를 intPart, ".", fractionalPart의 문자열 연결로 설정합니다.
  13. exponent = 0이면 다음을 수행합니다.
    1. exponentSign을 "+"로 둡니다.
    2. exponentDigits를 "0"으로 둡니다.
  14. 그렇지 않으면,
    1. exponent > 0이면 다음을 수행합니다.
      1. exponentSign을 "+"로 둡니다.
    2. 그렇지 않으면,
      1. 단언: exponent < 0입니다.
      2. exponentSign을 "-"로 둡니다.
      3. exponent를 -exponent로 설정합니다.
    3. exponentDigits를 exponent의 십진 표현 숫자들로 구성된 String 값으로 둡니다(순서대로, 선행 0 없이).
  15. significand를 significand, "e", exponentSign, exponentDigits의 문자열 연결로 설정합니다.
  16. sign과 significand의 문자열 연결을 반환합니다.
참고

위 규칙에서 요구하는 것보다 더 정확한 변환을 제공하는 구현의 경우, 11.b.i 단계의 다음 대체 버전을 지침으로 사용하는 것이 권장됩니다:

  1. exponent, intSignificand, ff를 ff ≥ 0, 10ff ≤ intSignificand < 10ff + 1, 𝔽(intSignificand × 10exponent - ff)가 𝔽(number)이고 ff가 가능한 한 작은 정수로 둡니다. intSignificand에 여러 가능성이 있으면 𝔽(intSignificand × 10exponent - ff)가 𝔽(number)에 가장 가까워지는 intSignificand를 선택합니다. 이러한 가능한 intSignificand 값이 두 개 있으면 짝수인 값을 선택합니다.

21.1.3.3 Number.prototype.toFixed ( fractionDigits )

참고 1

이 메서드는 이 Number 값을 소수점 뒤에 fractionDigits자리 숫자가 있는 십진 고정 소수점 표기법으로 나타낸 String을 반환합니다. fractionDigits가 undefined이면 0으로 간주합니다.

호출될 때 다음 단계를 수행합니다:

  1. number를 ? ThisNumberValue(this 값)으로 둡니다.
  2. fractionCount를 ? ToIntegerOrInfinity(fractionDigits)로 둡니다.
  3. 단언: fractionDigits가 undefined이면 fractionCount는 0입니다.
  4. fractionCount가 정수가 아니면 RangeError 예외를 던집니다.
  5. fractionCount < 0 또는 fractionCount > 100이면 RangeError 예외를 던집니다.
  6. number가 유한 Number가 아니면 Number::toString(number, 10)을 반환합니다.
  7. number를 ℝ(number)로 설정합니다.
  8. sign을 빈 String으로 둡니다.
  9. number < 0이면 다음을 수행합니다.
    1. sign을 "-"로 설정합니다.
    2. number를 -number로 설정합니다.
  10. number ≥ 1021이면 다음을 수행합니다.
    1. digitString을 ! ToString(𝔽(number))으로 둡니다.
  11. 그렇지 않으면,
    1. intValue를 intValue / 10fractionCount - number가 가능한 한 0에 가까워지는 정수로 둡니다. 이러한 intValue가 두 개 있으면 더 큰 intValue를 선택합니다.
    2. intValue = 0이면 digitString을 "0"으로 둡니다. 그렇지 않으면 digitString을 intValue의 십진 표현 숫자들로 구성된 String 값으로 둡니다(순서대로, 선행 0 없이).
    3. fractionCount ≠ 0이면 다음을 수행합니다.
      1. digitCount를 digitString의 길이로 둡니다.
      2. digitCount ≤ fractionCount이면 다음을 수행합니다.
        1. zeroPad를 코드 단위 0x0030 (DIGIT ZERO)이 fractionCount + 1 - digitCount회 나타나는 String 값으로 둡니다.
        2. digitString을 zeroPad와 digitString의 문자열 연결로 설정합니다.
        3. digitCount를 fractionCount + 1로 설정합니다.
      3. intPart를 digitString의 처음 digitCount - fractionCount개 코드 단위로 둡니다.
      4. fractionalPart를 digitString의 나머지 fractionCount개 코드 단위로 둡니다.
      5. digitString을 intPart, ".", fractionalPart의 문자열 연결로 설정합니다.
  12. sign과 digitString의 문자열 연결을 반환합니다.
참고 2

toString은 숫자를 인접한 Number 값과 구별하는 데 충분한 유효숫자만 출력하므로 일부 값에서는 toFixed의 출력이 toString보다 더 정밀할 수 있습니다. 예를 들어,

(1000000000000000128).toString()은 "1000000000000000100"을 반환하지만,
(1000000000000000128).toFixed(0)은 "1000000000000000128"을 반환합니다.

21.1.3.4 Number.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 국제화 API를 포함하는 ECMAScript 구현은 ECMA-402에 명시된 대로 이 메서드를 구현해야 합니다. 그렇지 않으면 다음과 같은 이 메서드의 명세를 사용합니다:

이 메서드는 호스트 환경의 현재 로캘 규칙에 따라 형식화된 이 Number 값을 나타내는 String 값을 생성합니다. 이 메서드는 구현 정의이며, 권장되지는 않지만 toString과 동일한 값을 반환하는 것도 허용됩니다.

이 메서드의 선택적 매개변수의 의미는 ECMA-402에 정의되어 있습니다. ECMA-402 지원을 포함하지 않는 구현은 해당 매개변수 위치를 다른 용도로 사용해서는 안 됩니다.

21.1.3.5 Number.prototype.toPrecision ( precision )

이 메서드는 이 Number 값을 유효숫자의 소수점 앞에 한 자리, 유효숫자의 소수점 뒤에 precision - 1자리 숫자가 있는 십진 지수 표기법 또는 precision개의 유효숫자가 있는 십진 고정 표기법으로 나타낸 String을 반환합니다. precision이 undefined이면 대신 ToString을 호출합니다.

호출될 때 다음 단계를 수행합니다:

  1. number를 ? ThisNumberValue(this 값)으로 둡니다.
  2. precision이 undefined이면 ! ToString(number)을 반환합니다.
  3. precisionCount를 ? ToIntegerOrInfinity(precision)로 둡니다.
  4. number가 유한 Number가 아니면 Number::toString(number, 10)을 반환합니다.
  5. precisionCount가 정수가 아니면 RangeError 예외를 던집니다.
  6. precisionCount < 1 또는 precisionCount > 100이면 RangeError 예외를 던집니다.
  7. number를 ℝ(number)로 설정합니다.
  8. sign을 빈 String으로 둡니다.
  9. number < 0이면 다음을 수행합니다.
    1. sign을 코드 단위 0x002D (HYPHEN-MINUS)로 설정합니다.
    2. number를 -number로 설정합니다.
  10. number = 0이면 다음을 수행합니다.
    1. significand를 코드 단위 0x0030 (DIGIT ZERO)이 precisionCount회 나타나는 String 값으로 둡니다.
    2. exponent를 0으로 둡니다.
  11. 그렇지 않으면,
    1. exponent와 intSignificand를 10precisionCount - 1 ≤ intSignificand < 10precisionCount이고 intSignificand × 10exponent - precisionCount + 1 - number가 가능한 한 0에 가까워지는 정수로 둡니다. 이러한 exponent와 intSignificand의 쌍이 두 개 있으면 intSignificand × 10exponent - precisionCount + 1이 더 큰 exponent와 intSignificand를 선택합니다.
    2. significand를 intSignificand의 십진 표현 숫자들로 구성된 String 값으로 둡니다(순서대로, 선행 0 없이).
    3. exponent < -6 또는 exponent ≥ precisionCount이면 다음을 수행합니다.
      1. 단언: exponent ≠ 0입니다.
      2. precisionCount ≠ 1이면 다음을 수행합니다.
        1. intPart를 significand의 첫 번째 코드 단위로 둡니다.
        2. fractionalPart를 significand의 나머지 precisionCount - 1개 코드 단위로 둡니다.
        3. significand를 intPart, ".", fractionalPart의 문자열 연결로 설정합니다.
      3. exponent > 0이면 다음을 수행합니다.
        1. exponentSign을 코드 단위 0x002B (PLUS SIGN)로 둡니다.
      4. 그렇지 않으면,
        1. 단언: exponent < 0입니다.
        2. exponentSign을 코드 단위 0x002D (HYPHEN-MINUS)로 둡니다.
        3. exponent를 -exponent로 설정합니다.
      5. exponentDigits를 exponent의 십진 표현 숫자들로 구성된 String 값으로 둡니다(순서대로, 선행 0 없이).
      6. sign, significand, 코드 단위 0x0065 (LATIN SMALL LETTER E), exponentSign, exponentDigits의 문자열 연결을 반환합니다.
  12. exponent = precisionCount - 1이면 sign과 significand의 문자열 연결을 반환합니다.
  13. exponent ≥ 0이면 다음을 수행합니다.
    1. significand를 significand의 처음 exponent + 1개 코드 단위, 코드 단위 0x002E (FULL STOP), 나머지 precisionCount - (exponent + 1)개 코드 단위의 문자열 연결로 설정합니다.
  14. 그렇지 않으면,
    1. significand를 코드 단위 0x0030 (DIGIT ZERO), 코드 단위 0x002E (FULL STOP), 코드 단위 0x0030 (DIGIT ZERO)의 -(exponent + 1)회 반복, String significand의 문자열 연결로 설정합니다.
  15. sign과 significand의 문자열 연결을 반환합니다.

21.1.3.6 Number.prototype.toString ( [ radix ] )

참고

선택적 radix는 2𝔽부터 36𝔽까지의 양 끝을 포함하는 구간에 있는 정수 Number 값이어야 합니다. radix가 undefined이면 10𝔽을 radix의 값으로 사용합니다.

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. x를 ? ThisNumberValue(this 값)으로 둡니다.
  2. radix가 undefined이면 radixMV를 10으로 둡니다.
  3. 그렇지 않으면 radixMV를 ? SnapToInteger(radix, truncate, 2, 36)로 둡니다.
  4. Number::toString(x, radixMV)을 반환합니다.

이 메서드는 제네릭이 아닙니다. this 값이 Number 또는 Number 객체가 아니면 TypeError 예외를 던집니다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 전송할 수 없습니다.

이 메서드의 "length" 속성은 1𝔽입니다.

21.1.3.7 Number.prototype.valueOf ( )

  1. ? ThisNumberValue(this 값)을 반환합니다.

21.1.3.7.1 ThisNumberValue ( arg )

추상 연산 ThisNumberValue. 인수 arg (ECMAScript 언어 값). 반환값: Number를 포함하는 정상 완료 또는 throw 완료. 호출되면 다음 단계를 수행한다.

  1. arg가 Number이면 arg를 반환합니다.
  2. arg가 Object이고 arg에 [[NumberData]] 내부 슬롯이 있으면 다음을 수행합니다.
    1. number를 arg.[[NumberData]]로 둡니다.
    2. 단언: number는 Number입니다.
    3. number를 반환합니다.
  3. TypeError 예외를 던집니다.

21.1.4 Number 인스턴스의 속성

Number 인스턴스는 Number 프로토타입 객체에서 속성을 상속하는 일반 객체입니다. Number 인스턴스에는 [[NumberData]] 내부 슬롯도 있습니다. [[NumberData]] 내부 슬롯은 이 Number 객체가 나타내는 Number 값입니다.

21.2 BigInt 객체

21.2.1 BigInt 생성자

BigInt 생성자는 다음과 같습니다:

  • %BigInt%입니다.
  • 전역 객체의 "BigInt" 속성의 초기값입니다.
  • 생성자가 아니라 함수로 호출될 때 타입 변환을 수행합니다.
  • new 연산자와 함께 사용하거나 서브클래싱하는 용도로 의도되지 않았습니다. 클래스 정의의 extends 절의 값으로 사용할 수 있지만 BigInt 생성자에 대한 super 호출은 예외를 발생시킵니다.

21.2.1.1 BigInt ( value )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. NewTarget이 undefined가 아니면 TypeError 예외를 던집니다.
  2. primitive를 ? ToPrimitive(value, number)로 둡니다.
  3. primitive가 Number이면 ? NumberToBigInt(primitive)를 반환합니다.
  4. ? ToBigInt(primitive)를 반환합니다.

21.2.1.1.1 NumberToBigInt ( number )

추상 연산 NumberToBigInt. 인수 number (Number). 반환값: BigInt를 포함하는 정상 완료 또는 throw 완료. 호출되면 다음 단계를 수행한다.

  1. number가 정수 Number가 아니면 RangeError 예외를 던집니다.
  2. ℤ(ℝ(number))를 반환합니다.

21.2.2 BigInt 생성자의 속성

BigInt 생성자는 다음과 같습니다:

  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 가집니다.
  • 다음 속성을 가집니다:

21.2.2.1 BigInt.asIntN ( bits, bigint )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. bits를 ? ToIndex(bits)로 설정합니다.
  2. bigint를 ? ToBigInt(bigint)로 설정합니다.
  3. remainder를 ℝ(bigint) modulo 2bits로 둡니다.
  4. remainder ≥ 2bits - 1이면 ℤ(remainder - 2bits)를 반환합니다.
  5. ℤ(remainder)를 반환합니다.

21.2.2.2 BigInt.asUintN ( bits, bigint )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. bits를 ? ToIndex(bits)로 설정합니다.
  2. bigint를 ? ToBigInt(bigint)로 설정합니다.
  3. ℤ(ℝ(bigint) modulo 2bits)를 반환합니다.

21.2.2.3 BigInt.prototype

BigInt.prototype의 초기값은 BigInt 프로토타입 객체입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.2.3 BigInt 프로토타입 객체의 속성

BigInt 프로토타입 객체는 다음과 같습니다:

  • %BigInt.prototype%입니다.
  • 일반 객체입니다.
  • BigInt 객체가 아니며 [[BigIntData]] 내부 슬롯을 가지지 않습니다.
  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 가집니다.

메서드 명세에서 “이 BigInt 값”이라는 구문은 메서드 호출의 this 값을 인수로 전달하여 추상 연산 ThisBigIntValue를 호출했을 때 반환되는 결과를 가리킵니다.

21.2.3.1 BigInt.prototype.constructor

BigInt.prototype.constructor의 초기값은 %BigInt%입니다.

21.2.3.2 BigInt.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 국제화 API를 포함하는 ECMAScript 구현은 ECMA-402에 명시된 대로 이 메서드를 구현해야 합니다. 그렇지 않으면 다음과 같은 이 메서드의 명세를 사용합니다:

이 메서드는 호스트 환경의 현재 로캘 규칙에 따라 형식화된 이 BigInt 값을 나타내는 String 값을 생성합니다. 이 메서드는 구현 정의이며, 권장되지는 않지만 toString과 동일한 값을 반환하는 것도 허용됩니다.

이 메서드의 선택적 매개변수의 의미는 ECMA-402에 정의되어 있습니다. ECMA-402 지원을 포함하지 않는 구현은 해당 매개변수 위치를 다른 용도로 사용해서는 안 됩니다.

21.2.3.3 BigInt.prototype.toString ( [ radix ] )

참고

선택적 radix는 2𝔽부터 36𝔽까지의 양 끝을 포함하는 구간에 있는 정수 Number 값이어야 합니다. radix가 undefined이면 10𝔽을 radix의 값으로 사용합니다.

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. x를 ? ThisBigIntValue(this 값)으로 둡니다.
  2. radix가 undefined이면 radixMV를 10으로 둡니다.
  3. 그렇지 않으면 radixMV를 ? SnapToInteger(radix, truncate, 2, 36)로 둡니다.
  4. BigInt::toString(x, radixMV)을 반환합니다.

이 메서드는 제네릭이 아닙니다. this 값이 BigInt 또는 BigInt 객체가 아니면 TypeError 예외를 던집니다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 전송할 수 없습니다.

21.2.3.4 BigInt.prototype.valueOf ( )

  1. ? ThisBigIntValue(this 값)을 반환합니다.

21.2.3.4.1 ThisBigIntValue ( arg )

추상 연산 ThisBigIntValue. 인수 arg (ECMAScript 언어 값). 반환값: BigInt를 포함하는 정상 완료 또는 throw 완료. 호출되면 다음 단계를 수행한다.

  1. arg가 BigInt이면 arg를 반환합니다.
  2. arg가 Object이고 arg에 [[BigIntData]] 내부 슬롯이 있으면 다음을 수행합니다.
    1. 단언: arg.[[BigIntData]]는 BigInt입니다.
    2. arg.[[BigIntData]]를 반환합니다.
  3. TypeError 예외를 던집니다.

21.2.3.5 BigInt.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 속성의 초기값은 String 값 "BigInt"입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성이 있습니다.

21.2.4 BigInt 인스턴스의 속성

BigInt 인스턴스는 BigInt 프로토타입 객체에서 속성을 상속하는 일반 객체입니다. BigInt 인스턴스에는 [[BigIntData]] 내부 슬롯도 있습니다. [[BigIntData]] 내부 슬롯은 이 BigInt 객체가 나타내는 BigInt 값입니다.

21.3 Math 객체

Math 객체는 다음과 같습니다:

  • %Math%입니다.
  • 전역 객체의 "Math" 속성의 초기값입니다.
  • 일반 객체입니다.
  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 가집니다.
  • 함수 객체가 아닙니다.
  • [[Construct]] 내부 메서드를 가지지 않으므로 new 연산자와 함께 생성자로 사용할 수 없습니다.
  • [[Call]] 내부 메서드를 가지지 않으므로 함수로 호출할 수 없습니다.
참고

이 명세에서 “x에 대한 Number 값”이라는 구문은 6.1.6.1에 정의된 기술적 의미를 가집니다.

21.3.1 Math 객체의 값 속성

21.3.1.1 Math.E

자연로그의 밑인 e에 대한 Number 값이며, 대략 2.7182818284590452354입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.3.1.2 Math.LN10

10의 자연로그에 대한 Number 값이며, 대략 2.302585092994046입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.3.1.3 Math.LN2

2의 자연로그에 대한 Number 값이며, 대략 0.6931471805599453입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.3.1.4 Math.LOG10E

자연로그의 밑인 e의 밑이 10인 로그에 대한 Number 값이며, 이 값은 대략 0.4342944819032518입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

참고

Math.LOG10E의 값은 Math.LN10 값의 역수와 대략 같습니다.

21.3.1.5 Math.LOG2E

자연로그의 밑인 e의 밑이 2인 로그에 대한 Number 값이며, 이 값은 대략 1.4426950408889634입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

참고

Math.LOG2E의 값은 Math.LN2 값의 역수와 대략 같습니다.

21.3.1.6 Math.PI

원의 지름에 대한 둘레의 비율인 π에 대한 Number 값이며, 대략 3.1415926535897932입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.3.1.7 Math.SQRT1_2

½의 제곱근에 대한 Number 값이며, 대략 0.7071067811865476입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

참고

Math.SQRT1_2의 값은 Math.SQRT2 값의 역수와 대략 같습니다.

21.3.1.8 Math.SQRT2

2의 제곱근에 대한 Number 값이며, 대략 1.4142135623730951입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성이 있습니다.

21.3.1.9 Math [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 속성의 초기값은 String 값 "Math"입니다.

이 속성에는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성이 있습니다.

21.3.2 Math 객체의 함수 속성

참고

acos, acosh, asin, asinh, atan, atanh, atan2, cbrt, cos, cosh, exp, expm1, hypot, log, log1p, log2, log10, pow, random, sin, sinh, tan, tanh 함수의 동작은 관심 있는 경계 사례를 나타내는 특정 인수 값에 대해 특정 결과를 요구하는 것을 제외하고는 여기에서 정확히 명시되지 않습니다. 다른 인수 값에 대해 이러한 함수는 익숙한 수학 함수의 결과에 대한 근삿값을 계산하도록 의도되지만, 근사 알고리즘의 선택에는 어느 정도의 재량이 허용됩니다. 일반적인 의도는 구현자가 특정 하드웨어 플랫폼에서 ECMAScript에 대해 해당 플랫폼의 C 프로그래머가 사용할 수 있는 것과 동일한 수학 라이브러리를 사용할 수 있도록 하는 것입니다.

알고리즘의 선택은 구현에 맡겨져 있지만, 구현에서는 Sun Microsystems의 자유롭게 배포 가능한 수학 라이브러리인 fdlibm에 포함된 IEEE 754-2019 산술용 근사 알고리즘을 사용하는 것이 권장됩니다(다만 이 표준에서 명시하는 것은 아닙니다)(http://www.netlib.org/fdlibm).

21.3.2.1 Math.abs ( x )

이 함수는 x의 절댓값을 반환합니다. 결과는 x와 크기가 같지만 양의 부호를 가집니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN이면 NaN을 반환합니다.
  3. n이 -0𝔽이면 +0𝔽을 반환합니다.
  4. n이 -∞𝔽이면 +∞𝔽을 반환합니다.
  5. n < -0𝔽이면 -n을 반환합니다.
  6. n을 반환합니다.

21.3.2.2 Math.acos ( x )

이 함수는 x의 아크코사인을 반환합니다. 결과는 라디안으로 표현되며 +0𝔽부터 𝔽(π)까지의 양 끝을 포함하는 구간에 있습니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN이거나, n > 1𝔽이거나, n < -1𝔽이면 NaN을 반환합니다.
  3. n이 1𝔽이면 +0𝔽을 반환합니다.
  4. ℝ(n)의 아크코사인을 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.3 Math.acosh ( x )

이 함수는 x의 역쌍곡코사인을 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN 또는 +∞𝔽 중 하나이면 n을 반환합니다.
  3. n이 1𝔽이면 +0𝔽을 반환합니다.
  4. n < 1𝔽이면 NaN을 반환합니다.
  5. ℝ(n)의 역쌍곡코사인을 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.4 Math.asin ( x )

이 함수는 x의 아크사인을 반환합니다. 결과는 라디안으로 표현되며 𝔽(-π / 2)부터 𝔽(π / 2)까지의 양 끝을 포함하는 구간에 있습니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN, +0𝔽, -0𝔽 중 하나이면 n을 반환합니다.
  3. n > 1𝔽 또는 n < -1𝔽이면 NaN을 반환합니다.
  4. ℝ(n)의 아크사인을 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.5 Math.asinh ( x )

이 함수는 x의 역쌍곡사인을 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 유한 Number가 아니거나 n이 +0𝔽 또는 -0𝔽 중 하나이면 n을 반환합니다.
  3. ℝ(n)의 역쌍곡사인을 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.6 Math.atan ( x )

이 함수는 x의 아크탄젠트를 반환합니다. 결과는 라디안으로 표현되며 𝔽(-π / 2)부터 𝔽(π / 2)까지의 양 끝을 포함하는 구간에 있습니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN, +0𝔽, -0𝔽 중 하나이면 n을 반환합니다.
  3. n이 +∞𝔽이면 π / 2를 나타내는 구현에서 근사한 Number 값을 반환합니다.
  4. n이 -∞𝔽이면 -π / 2를 나타내는 구현에서 근사한 Number 값을 반환합니다.
  5. ℝ(n)의 아크탄젠트를 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.7 Math.atanh ( x )

이 함수는 x의 역쌍곡탄젠트를 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN, +0𝔽, -0𝔽 중 하나이면 n을 반환합니다.
  3. n > 1𝔽 또는 n < -1𝔽이면 NaN을 반환합니다.
  4. n이 1𝔽이면 +∞𝔽을 반환합니다.
  5. n이 -1𝔽이면 -∞𝔽을 반환합니다.
  6. ℝ(n)의 역쌍곡탄젠트를 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.8 Math.atan2 ( y, x )

이 함수는 인수 y와 x의 몫 y / x의 아크탄젠트를 반환하며, 여기서 y와 x의 부호를 사용하여 결과의 사분면을 결정합니다. 두 인수를 받는 아크탄젠트 함수에서 y라는 이름의 인수가 첫 번째이고 x라는 이름의 인수가 두 번째인 것은 의도적이며 전통적인 방식이라는 점에 유의하십시오. 결과는 라디안으로 표현되며 -π부터 +π까지의 양 끝을 포함하는 구간에 있습니다.

호출될 때 다음 단계를 수행합니다:

  1. ny를 ? ToNumber(y)로 둡니다.
  2. nx를 ? ToNumber(x)로 둡니다.
  3. ny가 NaN이거나 nx가 NaN이면 NaN을 반환합니다.
  4. ny가 +∞𝔽이면 다음을 수행합니다.
    1. nx가 +∞𝔽이면 π / 4를 나타내는 구현에서 근사한 Number 값을 반환합니다.
    2. nx가 -∞𝔽이면 3π / 4를 나타내는 구현에서 근사한 Number 값을 반환합니다.
    3. π / 2를 나타내는 구현에서 근사한 Number 값을 반환합니다.
  5. ny가 -∞𝔽이면 다음을 수행합니다.
    1. nx가 +∞𝔽이면 -π / 4를 나타내는 구현에서 근사한 Number 값을 반환합니다.
    2. nx가 -∞𝔽이면 -3π / 4를 나타내는 구현에서 근사한 Number 값을 반환합니다.
    3. -π / 2를 나타내는 구현에서 근사한 Number 값을 반환합니다.
  6. ny가 +0𝔽이면 다음을 수행합니다.
    1. nx > +0𝔽이거나 nx가 +0𝔽이면 +0𝔽을 반환합니다.
    2. π를 나타내는 구현에서 근사한 Number 값을 반환합니다.
  7. ny가 -0𝔽이면 다음을 수행합니다.
    1. nx > +0𝔽이거나 nx가 +0𝔽이면 -0𝔽을 반환합니다.
    2. -π를 나타내는 구현에서 근사한 Number 값을 반환합니다.
  8. 단언: ny는 유한 Number이며 +0𝔽도 -0𝔽도 아닙니다.
  9. ny > +0𝔽이면 다음을 수행합니다.
    1. nx가 +∞𝔽이면 +0𝔽을 반환합니다.
    2. nx가 -∞𝔽이면 π를 나타내는 구현에서 근사한 Number 값을 반환합니다.
    3. nx가 +0𝔽 또는 -0𝔽 중 하나이면 π / 2를 나타내는 구현에서 근사한 Number 값을 반환합니다.
  10. ny < -0𝔽이면 다음을 수행합니다.
    1. nx가 +∞𝔽이면 -0𝔽을 반환합니다.
    2. nx가 -∞𝔽이면 -π를 나타내는 구현에서 근사한 Number 값을 반환합니다.
    3. nx가 +0𝔽 또는 -0𝔽 중 하나이면 -π / 2를 나타내는 구현에서 근사한 Number 값을 반환합니다.
  11. 단언: nx는 유한 Number이며 +0𝔽도 -0𝔽도 아닙니다.
  12. result를 abs(ℝ(ny) / ℝ(nx))의 아크탄젠트로 둡니다.
  13. nx < -0𝔽이면 다음을 수행합니다.
    1. ny > +0𝔽이면 result를 π - result로 설정합니다.
    2. 그렇지 않으면 result를 -π + result로 설정합니다.
  14. 그렇지 않으면,
    1. ny < -0𝔽이면 result를 -result로 설정합니다.
  15. result를 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.9 Math.cbrt ( x )

이 함수는 x의 세제곱근을 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 유한 Number가 아니거나 n이 +0𝔽 또는 -0𝔽 중 하나이면 n을 반환합니다.
  3. ℝ(n)의 세제곱근을 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.10 Math.ceil ( x )

이 함수는 x보다 작지 않은 가장 작은(-∞에 가장 가까운) 정수 Number 값을 반환합니다. x가 이미 정수 Number이면 결과는 x입니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 유한 Number가 아니거나 n이 +0𝔽 또는 -0𝔽 중 하나이면 n을 반환합니다.
  3. n < -0𝔽이고 n > -1𝔽이면 -0𝔽을 반환합니다.
  4. n이 정수 Number이면 n을 반환합니다.
  5. n보다 작지 않은 가장 작은(-∞에 가장 가까운) 정수 Number 값을 반환합니다.
참고

Math.ceil(x)의 값은 -Math.floor(-x)의 값과 같습니다.

21.3.2.11 Math.clz32 ( x )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToUint32(x)로 둡니다.
  2. p를 n의 부호 없는 32비트 이진 표현에서 선행 0 비트의 수로 둡니다.
  3. 𝔽(p)를 반환합니다.
참고

n이 +0𝔽 또는 -0𝔽 중 하나이면 이 메서드는 32𝔽를 반환합니다. n의 32비트 이진 인코딩에서 최상위 비트가 1이면 이 메서드는 +0𝔽을 반환합니다.

21.3.2.12 Math.cos ( x )

이 함수는 x의 코사인을 반환합니다. 인수는 라디안으로 표현됩니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 유한 Number가 아니면 NaN을 반환합니다.
  3. n이 +0𝔽 또는 -0𝔽 중 하나이면 1𝔽을 반환합니다.
  4. ℝ(n)의 코사인을 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.13 Math.cosh ( x )

이 함수는 x의 쌍곡코사인을 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN이면 NaN을 반환합니다.
  3. n이 +∞𝔽 또는 -∞𝔽 중 하나이면 +∞𝔽을 반환합니다.
  4. n이 +0𝔽 또는 -0𝔽 중 하나이면 1𝔽을 반환합니다.
  5. ℝ(n)의 쌍곡코사인을 나타내는 구현에서 근사한 Number 값을 반환합니다.
참고

Math.cosh(x)의 값은 (Math.exp(x) + Math.exp(-x)) / 2의 값과 같습니다.

21.3.2.14 Math.exp ( x )

이 함수는 x의 지수 함수(자연로그의 밑인 e를 x제곱한 값)를 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN 또는 +∞𝔽 중 하나이면 n을 반환합니다.
  3. n이 +0𝔽 또는 -0𝔽 중 하나이면 1𝔽을 반환합니다.
  4. n이 -∞𝔽이면 +0𝔽을 반환합니다.
  5. ℝ(n)의 지수 함수를 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.15 Math.expm1 ( x )

이 함수는 x의 지수 함수(자연로그의 밑인 e를 x제곱한 값)에서 1을 뺀 결과를 반환합니다. 결과는 x의 값이 0에 가까운 경우에도 정확하도록 계산됩니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN, +0𝔽, -0𝔽, +∞𝔽 중 하나이면 n을 반환합니다.
  3. n이 -∞𝔽이면 -1𝔽을 반환합니다.
  4. exp를 ℝ(n)의 지수 함수로 둡니다.
  5. exp - 1을 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.16 Math.floor ( x )

이 함수는 x보다 크지 않은 가장 큰(+∞에 가장 가까운) 정수 Number 값을 반환합니다. x가 이미 정수 Number이면 결과는 x입니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 유한 Number가 아니거나 n이 +0𝔽 또는 -0𝔽 중 하나이면 n을 반환합니다.
  3. n < 1𝔽이고 n > +0𝔽이면 +0𝔽을 반환합니다.
  4. n이 정수 Number이면 n을 반환합니다.
  5. n보다 크지 않은 가장 큰(+∞에 가장 가까운) 정수 Number 값을 반환합니다.
참고

Math.floor(x)의 값은 -Math.ceil(-x)의 값과 같습니다.

21.3.2.17 Math.fround ( x )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN이면 NaN을 반환합니다.
  3. n이 +0𝔽, -0𝔽, +∞𝔽, -∞𝔽 중 하나이면 n을 반환합니다.
  4. n32를 roundTiesToEven 모드를 사용하여 n을 IEEE 754-2019 binary32 형식으로 변환한 결과로 둡니다.
  5. n64를 n32를 IEEE 754-2019 binary64 형식으로 변환한 결과로 둡니다.
  6. n64에 대응하는 ECMAScript Number 값을 반환합니다.

21.3.2.18 Math.f16round ( x )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN이면 NaN을 반환합니다.
  3. n이 +0𝔽, -0𝔽, +∞𝔽, -∞𝔽 중 하나이면 n을 반환합니다.
  4. n16을 roundTiesToEven 모드를 사용하여 n을 IEEE 754-2019 binary16 형식으로 변환한 결과로 둡니다.
  5. n64를 n16을 IEEE 754-2019 binary64 형식으로 변환한 결과로 둡니다.
  6. n64에 대응하는 ECMAScript Number 값을 반환합니다.
참고

이 연산은 이중 반올림 가능성 때문에 binary32로 캐스팅한 다음 binary16으로 캐스팅하는 것과 같지 않습니다. 예를 들어 k = 1.00048828125000022204𝔽인 수를 고려하면 Math.f16round(k)는 1.0009765625𝔽이지만 Math.f16round(Math.fround(k))는 1𝔽입니다.

모든 플랫폼이 binary64에서 binary16으로의 캐스팅을 기본적으로 지원하는 것은 아닙니다. MIT 라이선스의 half 라이브러리를 포함하여 이를 제공할 수 있는 다양한 라이브러리가 있습니다. 또는 먼저 roundTiesToEven에서 binary64를 binary32로 캐스팅한 다음 결과가 잘못된 이중 반올림을 초래할 수 있는지 확인할 수 있습니다. 이러한 경우에는 binary32 값의 가수를 조정하여 초기 캐스팅을 roundTiesToOdd에서 수행했을 때 생성되는 값이 되도록 명시적으로 처리할 수 있습니다. 그런 다음 조정된 값을 roundTiesToEven에서 binary16으로 캐스팅하면 올바른 값이 생성됩니다.

21.3.2.19 Math.hypot ( ...args )

0개 이상의 인수가 주어지면 이 함수는 각 인수의 제곱합의 제곱근을 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. coerced를 새로운 빈 List로 둡니다.
  2. args의 각 요소 arg에 대해 다음을 수행합니다.
    1. n을 ? ToNumber(arg)로 둡니다.
    2. n을 coerced에 추가합니다.
  3. coerced의 각 요소 number에 대해 다음을 수행합니다.
    1. number가 +∞𝔽 또는 -∞𝔽 중 하나이면 +∞𝔽을 반환합니다.
  4. onlyZero를 true로 둡니다.
  5. coerced의 각 요소 number에 대해 다음을 수행합니다.
    1. number가 NaN이면 NaN을 반환합니다.
    2. number가 +0𝔽도 -0𝔽도 아니면 onlyZero를 false로 설정합니다.
  6. onlyZero가 true이면 +0𝔽을 반환합니다.
  7. coerced 요소들의 수학적 값의 제곱합의 제곱근을 나타내는 구현에서 근사한 Number 값을 반환합니다.

이 함수의 "length" 속성은 2𝔽입니다.

참고

구현은 이 함수가 두 개 이상의 인수로 호출될 때 단순한 구현에서 발생하기 쉬운 오버플로와 언더플로로 인한 정밀도 손실을 방지하도록 주의해야 합니다.

21.3.2.20 Math.imul ( x, y )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. a를 ℝ(? ToUint32(x))로 둡니다.
  2. b를 ℝ(? ToUint32(y))로 둡니다.
  3. product를 (a × b) modulo 232로 둡니다.
  4. product ≥ 231이면 𝔽(product - 232)를 반환합니다.
  5. 𝔽(product)를 반환합니다.

21.3.2.21 Math.log ( x )

이 함수는 x의 자연로그를 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN 또는 +∞𝔽 중 하나이면 n을 반환합니다.
  3. n이 1𝔽이면 +0𝔽을 반환합니다.
  4. n이 +0𝔽 또는 -0𝔽 중 하나이면 -∞𝔽을 반환합니다.
  5. n < -0𝔽이면 NaN을 반환합니다.
  6. ln(ℝ(n))을 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.22 Math.log1p ( x )

이 함수는 1 + x의 자연로그를 반환합니다. 결과는 x의 값이 0에 가까운 경우에도 정확하도록 계산됩니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN, +0𝔽, -0𝔽, +∞𝔽 중 하나이면 n을 반환합니다.
  3. n이 -1𝔽이면 -∞𝔽을 반환합니다.
  4. n < -1𝔽이면 NaN을 반환합니다.
  5. ln(1 + ℝ(n))을 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.23 Math.log10 ( x )

이 함수는 x의 밑이 10인 로그를 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN 또는 +∞𝔽 중 하나이면 n을 반환합니다.
  3. n이 1𝔽이면 +0𝔽을 반환합니다.
  4. n이 +0𝔽 또는 -0𝔽 중 하나이면 -∞𝔽을 반환합니다.
  5. n < -0𝔽이면 NaN을 반환합니다.
  6. log10(ℝ(n))을 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.24 Math.log2 ( x )

이 함수는 x의 밑이 2인 로그를 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN 또는 +∞𝔽 중 하나이면 n을 반환합니다.
  3. n이 1𝔽이면 +0𝔽을 반환합니다.
  4. n이 +0𝔽 또는 -0𝔽 중 하나이면 -∞𝔽을 반환합니다.
  5. n < -0𝔽이면 NaN을 반환합니다.
  6. log2(ℝ(n))을 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.25 Math.max ( ...args )

0개 이상의 인수가 주어지면 이 함수는 각 인수에 대해 ToNumber를 호출하고 결과 값 중 가장 큰 값을 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. coerced를 새로운 빈 List로 둡니다.
  2. args의 각 요소 arg에 대해 다음을 수행합니다.
    1. n을 ? ToNumber(arg)로 둡니다.
    2. n을 coerced에 추가합니다.
  3. highest를 -∞𝔽로 둡니다.
  4. coerced의 각 요소 number에 대해 다음을 수행합니다.
    1. number가 NaN이면 NaN을 반환합니다.
    2. number가 +0𝔽이고 highest가 -0𝔽이면 highest를 +0𝔽으로 설정합니다.
    3. number > highest이면 highest를 number로 설정합니다.
  5. highest를 반환합니다.
참고

가장 큰 값을 결정하기 위한 값의 비교는 +0𝔽을 -0𝔽보다 큰 것으로 간주한다는 점을 제외하면 IsLessThan 알고리즘을 사용하여 수행됩니다.

이 함수의 "length" 속성은 2𝔽입니다.

21.3.2.26 Math.min ( ...args )

0개 이상의 인수가 주어지면 이 함수는 각 인수에 대해 ToNumber를 호출하고 결과 값 중 가장 작은 값을 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. coerced를 새로운 빈 List로 둡니다.
  2. args의 각 요소 arg에 대해 다음을 수행합니다.
    1. n을 ? ToNumber(arg)로 둡니다.
    2. n을 coerced에 추가합니다.
  3. lowest를 +∞𝔽로 둡니다.
  4. coerced의 각 요소 number에 대해 다음을 수행합니다.
    1. number가 NaN이면 NaN을 반환합니다.
    2. number가 -0𝔽이고 lowest가 +0𝔽이면 lowest를 -0𝔽으로 설정합니다.
    3. number < lowest이면 lowest를 number로 설정합니다.
  5. lowest를 반환합니다.
참고

가장 작은 값을 결정하기 위한 값의 비교는 +0𝔽을 -0𝔽보다 큰 것으로 간주한다는 점을 제외하면 IsLessThan 알고리즘을 사용하여 수행됩니다.

이 함수의 "length" 속성은 2𝔽입니다.

21.3.2.27 Math.pow ( base, exponent )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. base를 ? ToNumber(base)로 설정합니다.
  2. exponent를 ? ToNumber(exponent)로 설정합니다.
  3. Number::exponentiate(base, exponent)를 반환합니다.

21.3.2.28 Math.random ( )

이 함수는 양의 부호를 가지며 +0𝔽 이상이지만 1𝔽보다 엄격히 작은 Number 값을 반환합니다. 이 값은 구현 정의 알고리즘 또는 전략을 사용하여 해당 범위에 걸쳐 대략 균등한 분포로 무작위 또는 의사 무작위로 선택됩니다.

서로 다른 realm에 대해 생성된 각 Math.random 함수는 연속 호출에서 서로 다른 값의 시퀀스를 생성해야 합니다.

21.3.2.29 Math.round ( x )

이 함수는 x에 가장 가깝고 정수인 Number 값을 반환합니다. 두 정수 Number가 x에 동일하게 가까우면 결과는 +∞에 더 가까운 Number 값입니다. x가 이미 정수이면 결과는 x입니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 유한 Number가 아니거나 n이 정수 Number이면 n을 반환합니다.
  3. n < 0.5𝔽이고 n > +0𝔽이면 +0𝔽을 반환합니다.
  4. n < -0𝔽이고 n ≥ -0.5𝔽이면 -0𝔽을 반환합니다.
  5. n에 가장 가까운 정수 Number를 반환하며, 동률인 경우 +∞에 더 가까운 Number를 우선합니다.
참고 1

Math.round(3.5)는 4를 반환하지만 Math.round(-3.5)는 -3을 반환합니다.

참고 2

Math.round(x)의 값이 항상 Math.floor(x + 0.5)의 값과 같은 것은 아닙니다. x가 -0𝔽이거나 x가 -0𝔽보다 작지만 -0.5𝔽 이상인 경우 Math.round(x)는 -0𝔽을 반환하지만 Math.floor(x + 0.5)는 +0𝔽을 반환합니다. Math.round(x)는 x + 0.5를 계산할 때 발생하는 내부 반올림 때문에 Math.floor(x + 0.5)의 값과 다를 수도 있습니다.

21.3.2.30 Math.sign ( x )

이 함수는 x의 부호를 반환하여 x가 양수인지, 음수인지 또는 0인지 나타냅니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN, +0𝔽, -0𝔽 중 하나이면 n을 반환합니다.
  3. n < -0𝔽이면 -1𝔽을 반환합니다.
  4. 1𝔽을 반환합니다.

21.3.2.31 Math.sin ( x )

이 함수는 x의 사인을 반환합니다. 인수는 라디안으로 표현됩니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN, +0𝔽, -0𝔽 중 하나이면 n을 반환합니다.
  3. n이 +∞𝔽 또는 -∞𝔽 중 하나이면 NaN을 반환합니다.
  4. ℝ(n)의 사인을 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.32 Math.sinh ( x )

이 함수는 x의 쌍곡사인을 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 유한 Number가 아니거나 n이 +0𝔽 또는 -0𝔽 중 하나이면 n을 반환합니다.
  3. ℝ(n)의 쌍곡사인을 나타내는 구현에서 근사한 Number 값을 반환합니다.
참고

Math.sinh(x)의 값은 (Math.exp(x) - Math.exp(-x)) / 2의 값과 같습니다.

21.3.2.33 Math.sqrt ( x )

이 함수는 x의 제곱근을 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN, +0𝔽, -0𝔽, +∞𝔽 중 하나이면 n을 반환합니다.
  3. n < -0𝔽이면 NaN을 반환합니다.
  4. 𝔽(ℝ(n)의 제곱근)을 반환합니다.

21.3.2.34 Math.sumPrecise ( items )

Numbers의 iterable이 주어지면 이 함수는 iterable의 각 값을 합산하고 그 합을 반환합니다. 어떤 값이라도 Number가 아니면 TypeError 예외를 던집니다.

호출될 때 다음 단계를 수행합니다:

  1. ? RequireObjectCoercible(items)를 수행합니다.
  2. iteratorRecord를 ? GetIterator(items, sync)로 둡니다.
  3. state를 minus-zero로 둡니다.
  4. sum을 0으로 둡니다.
  5. count를 0으로 둡니다.
  6. next를 not-started로 둡니다.
  7. next가 done이 아닌 동안 다음을 반복합니다.
    1. next를 ? IteratorStepValue(iteratorRecord)로 설정합니다.
    2. next가 done이 아니면 다음을 수행합니다.
      1. count ≥ 253 - 1이면 다음을 수행합니다.
        1. 참고: 이 단계는 실제로 도달할 것으로 예상되지 않으며, 구현이 이 명세를 위반하지 않고 입력이 “합리적인 크기”라고 가정할 수 있도록 하기 위해서만 포함되어 있습니다.
        2. error를 ThrowCompletion(새로 생성된 RangeError 객체)로 둡니다.
        3. ? IteratorClose(iteratorRecord, error)를 반환합니다.
      2. next가 Number가 아니면 다음을 수행합니다.
        1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
        2. ? IteratorClose(iteratorRecord, error)를 반환합니다.
      3. n을 next로 둡니다.
      4. state가 not-a-number가 아니면 다음을 수행합니다.
        1. n이 NaN이면 다음을 수행합니다.
          1. state를 not-a-number로 설정합니다.
        2. 그렇지 않고 n이 +∞𝔽이면 다음을 수행합니다.
          1. state가 minus-infinity이면 state를 not-a-number로 설정합니다.
          2. 그렇지 않으면 state를 plus-infinity로 설정합니다.
        3. 그렇지 않고 n이 -∞𝔽이면 다음을 수행합니다.
          1. state가 plus-infinity이면 state를 not-a-number로 설정합니다.
          2. 그렇지 않으면 state를 minus-infinity로 설정합니다.
        4. 그렇지 않고 n이 -0𝔽이 아니며 state가 minus-zero 또는 finite 중 하나이면 다음을 수행합니다.
          1. state를 finite로 설정합니다.
          2. sum을 sum + ℝ(n)으로 설정합니다.
      5. count를 count + 1로 설정합니다.
  8. state가 not-a-number이면 NaN을 반환합니다.
  9. state가 plus-infinity이면 +∞𝔽을 반환합니다.
  10. state가 minus-infinity이면 -∞𝔽을 반환합니다.
  11. state가 minus-zero이면 -0𝔽을 반환합니다.
  12. 𝔽(sum)을 반환합니다.
참고

sum의 값은 다양한 알고리즘을 사용하여 임의 정밀도 산술 없이 계산할 수 있습니다. 그중 하나는 Jonathan Richard Shewchuk의 Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates에 제시된 “Grow-Expansion” 알고리즘입니다. 더 최근의 알고리즘은 “Fast exact summation using small and large superaccumulators”에 제시되어 있으며, 해당 코드는 https://gitlab.com/radfordneal/xsum에서 사용할 수 있습니다.

21.3.2.35 Math.tan ( x )

이 함수는 x의 탄젠트를 반환합니다. 인수는 라디안으로 표현됩니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN, +0𝔽, -0𝔽 중 하나이면 n을 반환합니다.
  3. n이 +∞𝔽 또는 -∞𝔽 중 하나이면 NaN을 반환합니다.
  4. ℝ(n)의 탄젠트를 나타내는 구현에서 근사한 Number 값을 반환합니다.

21.3.2.36 Math.tanh ( x )

이 함수는 x의 쌍곡탄젠트를 반환합니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 NaN, +0𝔽, -0𝔽 중 하나이면 n을 반환합니다.
  3. n이 +∞𝔽이면 1𝔽을 반환합니다.
  4. n이 -∞𝔽이면 -1𝔽을 반환합니다.
  5. ℝ(n)의 쌍곡탄젠트를 나타내는 구현에서 근사한 Number 값을 반환합니다.
참고

Math.tanh(x)의 값은 (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x))의 값과 같습니다.

21.3.2.37 Math.trunc ( x )

이 함수는 소수 부분을 제거하여 수 x의 정수 부분을 반환합니다. x가 이미 정수이면 결과는 x입니다.

호출될 때 다음 단계를 수행합니다:

  1. n을 ? ToNumber(x)로 둡니다.
  2. n이 유한 Number가 아니거나 n이 +0𝔽 또는 -0𝔽 중 하나이면 n을 반환합니다.
  3. n < 1𝔽이고 n > +0𝔽이면 +0𝔽을 반환합니다.
  4. n < -0𝔽이고 n > -1𝔽이면 -0𝔽을 반환합니다.
  5. +0𝔽 방향으로 n에 가장 가까운 정수 Number를 반환합니다.

21.4 Date 객체

21.4.1 Date 객체 개요 및 추상 연산 정의

다음 추상 연산은 시간 값(21.4.1.1에 정의됨)을 대상으로 동작합니다. 모든 경우에 이러한 함수 중 하나의 인수가 NaN이면 결과도 NaN이 된다는 점에 유의하시기 바랍니다.

21.4.1.1 시간 값과 시간 범위

ECMAScript의 시간 측정은 POSIX의 시간 측정과 유사하며, 특히 역산 그레고리력, 1970년 1월 1일 UTC 시작 시점의 자정인 epoch, 그리고 모든 날이 정확히 86,400초(각각 1000밀리초)로 구성된다는 정의를 공유합니다.

ECMAScript 시간 값은 Number이며, 밀리초 정밀도로 시간상의 한 시점을 나타내는 정수 Number(유한 시간 값이라고 함)이거나 특정 시점을 나타내지 않는 NaN입니다. MillisecondsPerDay의 정수배인 유한 시간 값(즉, 어떤 정수 d에 대해 MillisecondsPerDay × d인 값)은 에포크로부터 d개의 온전한 UTC 일이 지난 뒤 시작되는 UTC 일의 시작 시점을 나타냅니다(음수 d의 경우 에포크보다 앞선 시점). 그 밖의 모든 유한 시간 값 tv는 그러한 배수이면서 그보다 앞선 가장 큰 유한 시간 값 s를 기준으로 정의되며, s와 동일한 UTC 일 내에서 s보다 (tv - s)밀리초 뒤에 발생하는 시점을 나타냅니다.

시간 값은 UTC 윤초를 고려하지 않습니다. 양의 윤초 안의 순간을 나타내는 시간 값은 없으며, 음의 윤초로 UTC 시간선에서 제거된 순간을 나타내는 시간 값은 존재합니다. 그러나 시간 값의 정의는 여전히 UTC와 구간별 정렬을 이루며, 불연속은 윤초 경계에서만 발생하고 윤초 이외에서는 차이가 0입니다.

Number는 -9,007,199,254,740,992부터 9,007,199,254,740,992까지의 모든 정수를 정확하게 나타낼 수 있습니다(21.1.2.8 및 21.1.2.6). 시간 값은 이보다 약간 작은 -8,640,000,000,000,000부터 8,640,000,000,000,000밀리초까지의 범위를 지원합니다. 이는 1970년 1월 1일 UTC 시작 시점의 자정을 기준으로 정확히 -100,000,000일부터 100,000,000일까지의 시간 값 범위를 제공합니다.

1970년 1월 1일 UTC 시작 시점의 자정 정확한 순간은 시간 값 +0𝔽으로 나타냅니다.

참고

역산 그레고리력에서 윤년은 정확히 4로 나누어떨어지고 동시에 400으로 나누어떨어지거나 100으로 나누어떨어지지 않는 해입니다.

역산 그레고리력의 400년 주기에는 97개의 윤년이 포함됩니다. 따라서 연평균은 365.2425일이며 이는 31,556,952,000밀리초입니다. 따라서 Number가 밀리초 정밀도로 정확하게 나타낼 수 있는 최대 범위는 1970년을 기준으로 약 -285,426년부터 285,426년까지입니다. 이 절에 명시된 시간 값이 지원하는 더 작은 범위는 1970년을 기준으로 약 -273,790년부터 273,790년까지입니다.

21.4.1.2 시간 관련 상수

이러한 상수는 다음 절의 알고리즘에서 참조됩니다.

HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
MillisecondsPerSecond = 1000
MillisecondsPerMinute = 60000 = MillisecondsPerSecond × SecondsPerMinute
MillisecondsPerHour = 3600000 = MillisecondsPerMinute × MinutesPerHour
MillisecondsPerDay = 86400000 = MillisecondsPerHour × HoursPerDay
NanosecondsPerDay = 106 × MillisecondsPerDay = 8.64 × 1013
NanosecondsPerSecond = 106 × MillisecondsPerSecond = 109
NanosecondsPerMillisecond = 106
NanosecondsPerMicrosecond = 103
MaxEpochNanoseconds = 108 × NanosecondsPerDay = 8.64 × 1021
MinEpochNanoseconds = -MaxEpochNanoseconds = -8.64 × 1021

21.4.1.3 Day ( tv )

추상 연산 Day. 인수 tv (a finite time value). 반환값: 정수. tv가 속하는 날짜의 날짜 번호를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. floor(ℝ(tv) / MillisecondsPerDay)를 반환합니다.

21.4.1.4 TimeWithinDay ( tv )

추상 연산 TimeWithinDay. 인수 tv (a finite time value). 반환값: an integer in the interval from 0 (inclusive) to MillisecondsPerDay (exclusive). tv가 속하는 날의 시작 이후 경과한 밀리초 수를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. ℝ(tv) modulo MillisecondsPerDay를 반환합니다.

21.4.1.5 DayFromYear ( y )

추상 연산 DayFromYear. 인수 y (정수). 반환값: 정수. 연도 y의 첫날에 해당하는 날짜 번호를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. 참고: 다음 단계에서 numberYears1, numberYears4, numberYears100 및 numberYears400은 각각 epoch와 연도 y의 시작 사이에 나타나는 1, 4, 100 및 400으로 나누어떨어지는 연도의 수를 나타냅니다. y가 epoch보다 이전이면 이 수는 음수입니다.
  2. numberYears1을 (y - 1970)으로 둡니다.
  3. numberYears4를 floor((y - 1969) / 4)로 둡니다.
  4. numberYears100을 floor((y - 1901) / 100)으로 둡니다.
  5. numberYears400을 floor((y - 1601) / 400)으로 둡니다.
  6. 365 × numberYears1 + numberYears4 - numberYears100 + numberYears400을 반환합니다.

21.4.1.6 TimeFromYear ( y )

추상 연산 TimeFromYear. 인수 y (정수). 반환값: a time value. 연도 y의 시작에 해당하는 시간 값을 반환합니다. 호출되면 다음 단계를 수행한다.

  1. 𝔽(MillisecondsPerDay × DayFromYear(y))를 반환합니다.

21.4.1.7 YearFromTime ( tv )

추상 연산 YearFromTime. 인수 tv (a finite time value). 반환값: 정수. tv가 속하는 연도를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. TimeFromYear(y) ≤ tv를 만족하는 가장 큰(+∞에 가장 가까운) 정수 y를 반환합니다.

21.4.1.8 DayWithinYear ( tv )

추상 연산 DayWithinYear. 인수 tv (a finite time value). 반환값: an integer in the inclusive interval from 0 to 365. 호출되면 다음 단계를 수행한다.

  1. Day(tv) - DayFromYear(YearFromTime(tv))를 반환합니다.

21.4.1.9 InLeapYear ( tv )

추상 연산 InLeapYear. 인수 tv (a finite time value). 반환값: (0 또는 1). tv가 윤년에 속하면 1을 반환하고 그렇지 않으면 0을 반환합니다. 호출되면 다음 단계를 수행한다.

  1. y를 YearFromTime(tv)로 둡니다.
  2. (y modulo 400) = 0이면 1을 반환합니다.
  3. (y modulo 100) = 0이면 0을 반환합니다.
  4. (y modulo 4) = 0이면 1을 반환합니다.
  5. 0을 반환합니다.

21.4.1.10 MonthFromTime ( tv )

추상 연산 MonthFromTime. 인수 tv (a finite time value). 반환값: an integer in the inclusive interval from 0 to 11. tv가 속하는 월을 식별하는 정수를 반환합니다. 월 값 0은 1월, 1은 2월, 2는 3월, 3은 4월, 4는 5월, 5는 6월, 6은 7월, 7은 8월, 8은 9월, 9는 10월, 10은 11월, 11은 12월을 지정합니다. MonthFromTime(+0𝔽) = 0이며 이는 1970년 1월 1일 목요일에 대응한다는 점에 유의하시기 바랍니다. 호출되면 다음 단계를 수행한다.

  1. inLeapYear를 InLeapYear(tv)로 둡니다.
  2. dayWithinYear를 DayWithinYear(tv)로 둡니다.
  3. dayWithinYear < 31이면 0을 반환합니다.
  4. dayWithinYear < 59 + inLeapYear이면 1을 반환합니다.
  5. dayWithinYear < 90 + inLeapYear이면 2를 반환합니다.
  6. dayWithinYear < 120 + inLeapYear이면 3을 반환합니다.
  7. dayWithinYear < 151 + inLeapYear이면 4를 반환합니다.
  8. dayWithinYear < 181 + inLeapYear이면 5를 반환합니다.
  9. dayWithinYear < 212 + inLeapYear이면 6을 반환합니다.
  10. dayWithinYear < 243 + inLeapYear이면 7을 반환합니다.
  11. dayWithinYear < 273 + inLeapYear이면 8을 반환합니다.
  12. dayWithinYear < 304 + inLeapYear이면 9를 반환합니다.
  13. dayWithinYear < 334 + inLeapYear이면 10을 반환합니다.
  14. 단언: dayWithinYear < 365 + inLeapYear입니다.
  15. 11을 반환합니다.

21.4.1.11 DateFromTime ( tv )

추상 연산 DateFromTime. 인수 tv (a finite time value). 반환값: an integer in the inclusive interval from 1 to 31. tv가 속하는 월의 날짜를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. inLeapYear를 InLeapYear(tv)로 둡니다.
  2. dayWithinYear를 DayWithinYear(tv)로 둡니다.
  3. month를 MonthFromTime(tv)로 둡니다.
  4. month = 0이면 dayWithinYear + 1을 반환합니다.
  5. month = 1이면 dayWithinYear - 30을 반환합니다.
  6. month = 2이면 dayWithinYear - 58 - inLeapYear를 반환합니다.
  7. month = 3이면 dayWithinYear - 89 - inLeapYear를 반환합니다.
  8. month = 4이면 dayWithinYear - 119 - inLeapYear를 반환합니다.
  9. month = 5이면 dayWithinYear - 150 - inLeapYear를 반환합니다.
  10. month = 6이면 dayWithinYear - 180 - inLeapYear를 반환합니다.
  11. month = 7이면 dayWithinYear - 211 - inLeapYear를 반환합니다.
  12. month = 8이면 dayWithinYear - 242 - inLeapYear를 반환합니다.
  13. month = 9이면 dayWithinYear - 272 - inLeapYear를 반환합니다.
  14. month = 10이면 dayWithinYear - 303 - inLeapYear를 반환합니다.
  15. 단언: month = 11입니다.
  16. dayWithinYear - 333 - inLeapYear를 반환합니다.

21.4.1.12 WeekDay ( tv )

추상 연산 WeekDay. 인수 tv (a finite time value). 반환값: an integer in the inclusive interval from 0 to 6. tv가 속하는 요일을 식별하는 정수를 반환합니다. 요일 값 0은 일요일, 1은 월요일, 2는 화요일, 3은 수요일, 4는 목요일, 5는 금요일, 6은 토요일을 지정합니다. WeekDay(+0𝔽) = 4이며 이는 1970년 1월 1일 목요일에 대응한다는 점에 유의하시기 바랍니다. 호출되면 다음 단계를 수행한다.

  1. (Day(tv) + 4) modulo 7을 반환합니다.

21.4.1.13 HourFromTime ( tv )

추상 연산 HourFromTime. 인수 tv (a finite time value). 반환값: an integer in the inclusive interval from 0 to 23. tv가 속하는 날의 시를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. floor(ℝ(tv) / MillisecondsPerHour) modulo HoursPerDay를 반환합니다.

21.4.1.14 MinuteFromTime ( tv )

추상 연산 MinuteFromTime. 인수 tv (a finite time value). 반환값: an integer in the inclusive interval from 0 to 59. tv가 속하는 시의 분을 반환합니다. 호출되면 다음 단계를 수행한다.

  1. floor(ℝ(tv) / MillisecondsPerMinute) modulo MinutesPerHour를 반환합니다.

21.4.1.15 SecondFromTime ( tv )

추상 연산 SecondFromTime. 인수 tv (a finite time value). 반환값: an integer in the inclusive interval from 0 to 59. tv가 속하는 분의 초를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. floor(ℝ(tv) / MillisecondsPerSecond) modulo SecondsPerMinute를 반환합니다.

21.4.1.16 MillisecondFromTime ( tv )

추상 연산 MillisecondFromTime. 인수 tv (a finite time value). 반환값: an integer in the inclusive interval from 0 to 999. tv가 속하는 초의 밀리초를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. ℝ(tv) modulo MillisecondsPerSecond를 반환합니다.

21.4.1.17 Epoch 나노초와 범위

epoch 나노초 수는 나노초 정밀도로 시간의 한 순간을 나타내는 정수입니다. 시간 값과 동일한 범위를 지원하지만 나노초로 표현되며, MinEpochNanoseconds부터 MaxEpochNanoseconds까지입니다. 시간 값 NaN에 대응하는 나노초 값은 없으며, 특정 순간이 없음을 나타내는 표현도 없습니다.

1970년 1월 1일 UTC 시작 시점의 자정 정확한 순간은 값 0으로 나타냅니다. 최대 값은 MaxEpochNanoseconds이고 최소 값은 MinEpochNanoseconds입니다.

21.4.1.18 GetUTCEpochNanoseconds ( year, month, day, hour, minute, second, millisecond, microsecond, nanosecond )

추상 연산 GetUTCEpochNanoseconds. 인수 year (정수), month (an integer in the inclusive interval from 1 to 12), day (an integer in the inclusive interval from 1 to 31), hour (an integer in the inclusive interval from 0 to 23), minute (an integer in the inclusive interval from 0 to 59), second (an integer in the inclusive interval from 0 to 59), millisecond (an integer in the inclusive interval from 0 to 999), microsecond (an integer in the inclusive interval from 0 to 999) 및 nanosecond (an integer in the inclusive interval from 0 to 999). 반환값: an epoch nanoseconds count. 반환 값은 주어진 ISO 8601 달력 날짜와 UTC의 시계 시간에 대응하는 epoch 나노초 수입니다. 호출되면 다음 단계를 수행한다.

  1. date를 MakeDay(𝔽(year), 𝔽(month - 1), 𝔽(day))로 둡니다.
  2. time을 MakeTime(𝔽(hour), 𝔽(minute), 𝔽(second), 𝔽(millisecond))로 둡니다.
  3. epochMilliseconds를 MakeDate(date, time)로 둡니다.
  4. 단언: epochMilliseconds는 정수 Number입니다.
  5. ℝ(epochMilliseconds) × NanosecondsPerMillisecond + microsecond × NanosecondsPerMicrosecond + nanosecond를 반환합니다.

21.4.1.19 시간대 식별자

ECMAScript의 시간대는 시간대 식별자로 나타내며, 이는 0x0000부터 0x007F까지의 폐구간에 속하는 코드 단위만으로 구성된 String입니다. ECMAScript 구현체가 지원하는 시간대는 AvailableNamedTimeZoneIdentifiers가 반환하는 Time Zone Identifier Record의 [[Identifier]] 필드로 나타내는 사용 가능한 이름 있는 시간대이거나, IsTimeZoneOffsetString이 true를 반환하는 String으로 나타내는 오프셋 시간대일 수 있습니다.

주 시간대 식별자는 사용 가능한 이름 있는 시간대의 기본 식별자입니다. 비주 시간대 식별자는 주 시간대 식별자가 아닌 사용 가능한 이름 있는 시간대의 식별자입니다. 사용 가능한 이름 있는 시간대 식별자는 주 시간대 식별자 또는 비주 시간대 식별자 중 하나입니다. 각 사용 가능한 이름 있는 시간대 식별자는 정확히 하나의 사용 가능한 이름 있는 시간대와 연결됩니다. 각 사용 가능한 이름 있는 시간대는 정확히 하나의 주 시간대 식별자 및 0개 이상의 비주 시간대 식별자와 연결됩니다.

ECMAScript 구현체는 식별자가 "UTC"인 사용 가능한 이름 있는 시간대를 지원해야 하며, 이는 UTC 시간대의 주 시간대 식별자여야 합니다. 또한 구현체는 임의의 수의 다른 사용 가능한 이름 있는 시간대를 지원할 수 있습니다.

ECMA-402 국제화 API 명세에 설명된 시간대 요구 사항을 따르는 구현체를 시간대 인식 구현체라고 합니다. 시간대 인식 구현체는 IANA Time Zone Database의 “Zone” 및 “Link” 이름에 대응하는 사용 가능한 이름 있는 시간대를 지원해야 하며, 그러한 이름만 지원해야 합니다. 시간대 인식 구현체에서 주 시간대 식별자는 IANA Time Zone Database의 “Zone” 이름이고, 비주 시간대 식별자는 각각 “Link” 이름입니다. 다만 ECMA-402에 명시된 AvailableNamedTimeZoneIdentifiers에 의해 특별히 재정의된 경우는 제외합니다. 전체 IANA Time Zone Database를 지원하지 않는 구현체에도 시간대를 나타내는 식별자로 IANA Time Zone Database 이름을 사용하는 것이 권장됩니다.

21.4.1.20 GetNamedTimeZoneEpochNanoseconds ( timeZoneIdentifier, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond )

구현 정의 추상 연산 GetNamedTimeZoneEpochNanoseconds. 인수 timeZoneIdentifier (String), year (정수), month (an integer in the inclusive interval from 1 to 12), day (an integer in the inclusive interval from 1 to 31), hour (an integer in the inclusive interval from 0 to 23), minute (an integer in the inclusive interval from 0 to 59), second (an integer in the inclusive interval from 0 to 59), millisecond (an integer in the inclusive interval from 0 to 999), microsecond (an integer in the inclusive interval from 0 to 999) 및 nanosecond (an integer in the inclusive interval from 0 to 999). 반환값: 리스트 (요소: epoch nanoseconds counts). 반환된 List의 각 값은 timeZoneIdentifier가 식별하는 이름 있는 시간대에서 주어진 ISO 8601 달력 날짜 및 시계 시간에 대응하는 epoch 나노초 수를 나타냅니다.

입력이 음의 시간대 전이 때문에 두 번 이상 발생하는 로컬 시간을 나타내면(예: 일광 절약 시간이 끝나거나 시간대 규칙 변경으로 시간대 오프셋이 감소하는 경우) 반환된 List에는 둘 이상의 요소가 있으며 숫자 값의 오름차순으로 정렬됩니다. 입력이 양의 시간대 전이 때문에 건너뛴 로컬 시간을 나타내면(예: 일광 절약 시간이 시작되거나 시간대 규칙 변경으로 시간대 오프셋이 증가하는 경우) 반환된 List는 비어 있습니다. 그 밖의 경우 반환된 List에는 하나의 요소가 있습니다.

어떤 시간대에도 로컬 정치적 규칙을 포함하지 않는 ECMAScript 구현체에서 사용하는 GetNamedTimeZoneEpochNanoseconds의 기본 구현은 호출되면 다음 단계를 수행합니다:

  1. 단언: timeZoneIdentifier는 "UTC"입니다.
  2. epochNanoseconds를 GetUTCEpochNanoseconds(year, month, day, hour, minute, second, millisecond, microsecond, nanosecond)로 둡니다.
  3. « epochNanoseconds »을 반환합니다.
참고

시간대 인식 구현체는 IANA Time Zone Database의 시간대 정보를 사용해야 하며, 다른 모든 구현체에도 이를 사용하는 것이 권장됩니다.

America/New_York에서 2017년 11월 5일 오전 1:30은 두 번 반복되므로 GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 11, 5, 1, 30, 0, 0, 0, 0)은 길이가 2인 List를 반환하며, 첫 번째 요소는 05:30 UTC(UTC 오프셋 -04:00인 미국 동부 일광 절약 시간의 01:30에 대응)를 나타내고 두 번째 요소는 06:30 UTC(UTC 오프셋 -05:00인 미국 동부 표준시의 01:30에 대응)를 나타냅니다.

America/New_York에서 2017년 3월 12일 오전 2:30은 존재하지 않으므로 GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 3, 12, 2, 30, 0, 0, 0, 0)은 빈 List를 반환합니다.

21.4.1.21 GetNamedTimeZoneOffsetNanoseconds ( timeZoneIdentifier, epochNanoseconds )

구현 정의 추상 연산 GetNamedTimeZoneOffsetNanoseconds. 인수 timeZoneIdentifier (String) 및 epochNanoseconds (an epoch nanoseconds count). 반환값: 정수.

반환된 정수는 epoch 나노초 수 epochNanoseconds에 대응하는 순간에 timeZoneIdentifier가 식별하는 이름 있는 시간대의 UTC로부터의 오프셋을 나노초 단위로 나타냅니다.

어떤 시간대에도 로컬 정치적 규칙을 포함하지 않는 ECMAScript 구현체에서 사용하는 GetNamedTimeZoneOffsetNanoseconds의 기본 구현은 호출되면 다음 단계를 수행합니다:

  1. 단언: timeZoneIdentifier는 "UTC"입니다.
  2. 0을 반환합니다.
참고

시간대 오프셋 값은 양수 또는 음수일 수 있습니다.

21.4.1.22 Time Zone Identifier Record

Time Zone Identifier Record는 사용 가능한 이름 있는 시간대 식별자 및 이에 대응하는 주 시간대 식별자를 설명하는 데 사용하는 Record입니다.

Time Zone Identifier Record에는 표 60에 나열된 필드가 있습니다.

표 60: Time Zone Identifier Record 필드
필드 이름 값 의미
[[Identifier]] a String 구현체가 지원하는 사용 가능한 이름 있는 시간대 식별자입니다.
[[PrimaryIdentifier]] a String [[Identifier]]가 해석되는 주 시간대 식별자입니다.
참고

[[Identifier]]가 주 시간대 식별자이면 [[Identifier]]는 [[PrimaryIdentifier]]입니다.

21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )

구현 정의 추상 연산 AvailableNamedTimeZoneIdentifiers. 인수 없음. 반환값: 리스트 (요소: Time Zone Identifier 레코드). 결과는 이 구현체에서 사용할 수 있는 모든 이름 있는 시간대 식별자와 각 사용 가능한 이름 있는 시간대 식별자에 대응하는 주 시간대 식별자를 설명합니다. List는 각 Time Zone Identifier Record의 [[Identifier]] 필드에 따라 정렬됩니다.

ECMA-402 국제화 API를 구현하는 모든 구현체를 포함한 시간대 인식 구현체는 ECMA-402에 명시된 대로 AvailableNamedTimeZoneIdentifiers 추상 연산을 구현해야 합니다. 그렇지 않으면 AvailableNamedTimeZoneIdentifiers는 호출되면 다음 단계를 수행합니다:

  1. 구현체가 어떤 시간대에도 로컬 정치적 규칙을 포함하지 않으면, 다음을 수행합니다.
    1. « Time Zone Identifier Record { [[Identifier]]: "UTC", [[PrimaryIdentifier]]: "UTC" } »를 반환합니다.
  2. identifiers를 고유한 사용 가능한 이름 있는 시간대 식별자의 List로 두고, 사전식 코드 단위 순서에 따라 정렬합니다.
  3. result를 새로운 빈 List로 둡니다.
  4. identifiers의 각 요소 identifier에 대해 다음을 수행합니다.
    1. primary를 identifier로 둡니다.
    2. identifier가 이 구현체의 비주 시간대 식별자이고 identifier가 "UTC"가 아니면, 다음을 수행합니다.
      1. primary를 identifier와 연결된 주 시간대 식별자로 설정합니다.
      2. 참고: 구현체는 주 시간대 식별자를 얻기 위해 identifier를 반복적으로 해석해야 할 수 있습니다.
    3. record를 Time Zone Identifier Record { [[Identifier]]: identifier, [[PrimaryIdentifier]]: primary }로 둡니다.
    4. record를 result에 추가합니다.
  5. 단언: result에는 record.[[Identifier]]가 "UTC"이고 record.[[PrimaryIdentifier]]가 "UTC"인 Time Zone Identifier Record record가 포함되어 있습니다.
  6. result를 반환합니다.

21.4.1.24 SystemTimeZoneIdentifier ( )

구현 정의 추상 연산 SystemTimeZoneIdentifier. 인수 없음. 반환값: String. 호스트 환경의 현재 시간대를 나타내는 String을 반환하며, 이는 IsTimeZoneOffsetString이 true를 반환하는 UTC 오프셋을 나타내는 String 또는 주 시간대 식별자 중 하나입니다. 호출되면 다음 단계를 수행한다.

  1. 구현체가 UTC 시간대만 지원하면 "UTC"를 반환합니다.
  2. systemTimeZoneString을 호스트 환경의 현재 시간대를 나타내는 String으로 두며, 주 시간대 식별자 또는 오프셋 시간대 식별자 중 하나입니다.
  3. systemTimeZoneString을 반환합니다.
참고

구현체가 Date 객체의 메서드에서 일반적으로 제공하는 기능 수준을 보장하기 위해, 그러한 것이 존재한다면 SystemTimeZoneIdentifier가 호스트 환경의 시간대 설정에 대응하는 IANA 시간대 이름을 반환하는 것이 권장됩니다. GetNamedTimeZoneEpochNanoseconds 및 GetNamedTimeZoneOffsetNanoseconds는 해당 시간대에 표준시 및 일광 절약 시간에 대한 로컬 정치적 규칙이 존재하는 경우 이를 반영해야 합니다.

예를 들어 호스트 환경이 사용자가 미국 동부 시간을 자신의 시간대로 선택한 시스템의 브라우저이면 SystemTimeZoneIdentifier는 "America/New_York"를 반환합니다.

21.4.1.25 LocalTime ( tv )

추상 연산 LocalTime. 인수 tv (a finite time value). 반환값: 정수인 Number. tv를 UTC에서 로컬 시간으로 변환합니다. tv에 적용되는 표준시 및 일광 절약 시간에 대한 로컬 정치적 규칙을 사용하여 이 절에 명시된 방식으로 결과를 결정해야 합니다. 호출되면 다음 단계를 수행한다.

  1. systemTimeZoneIdentifier를 SystemTimeZoneIdentifier()로 둡니다.
  2. IsTimeZoneOffsetString(systemTimeZoneIdentifier)이 true이면, 다음을 수행합니다.
    1. offsetNanoseconds를 ParseTimeZoneOffsetString(systemTimeZoneIdentifier)으로 둡니다.
  3. 그렇지 않으면,
    1. offsetNanoseconds를 GetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, ℝ(tv) × NanosecondsPerMillisecond)로 둡니다.
  4. offsetMilliseconds를 truncate(offsetNanoseconds / NanosecondsPerMillisecond)로 둡니다.
  5. tv + 𝔽(offsetMilliseconds)를 반환합니다.
참고 1

로컬 시간 tv에 대한 정치적 규칙을 구현체 안에서 사용할 수 없으면 SystemTimeZoneIdentifier가 "UTC"를 반환하고 GetNamedTimeZoneOffsetNanoseconds가 0을 반환하므로 결과는 tv입니다.

참고 2

시간대 인식 구현체는 IANA Time Zone Database https://www.iana.org/time-zones/의 시간대 정보를 사용해야 하며, 다른 모든 구현체에도 이를 사용하는 것이 권장됩니다.

참고 3

반복되는 시간이 있는 음의 시간대 전이 시점(예: 일광 절약 시간이 끝나거나 시간대 조정이 감소하는 경우)에 서로 다른 두 입력 시간 값 tvUTC가 동일한 로컬 시간 tlocal로 변환됩니다.

LocalTime(UTC(tvlocal))은 반드시 항상 tvlocal과 같지는 않습니다. 마찬가지로 UTC(LocalTime(tvUTC))도 반드시 항상 tvUTC과 같지는 않습니다.

21.4.1.26 UTC ( t )

추상 연산 UTC. 인수 t (Number). 반환값: a time value. t를 로컬 시간에서 UTC 시간 값으로 변환합니다. t에 적용되는 표준시 및 일광 절약 시간에 대한 로컬 정치적 규칙을 사용하여 이 절에 명시된 방식으로 결과를 결정해야 합니다. 호출되면 다음 단계를 수행한다.

  1. t가 유한 Number가 아니면 NaN을 반환합니다.
  2. systemTimeZoneIdentifier를 SystemTimeZoneIdentifier()로 둡니다.
  3. IsTimeZoneOffsetString(systemTimeZoneIdentifier)이 true이면, 다음을 수행합니다.
    1. offsetNanoseconds를 ParseTimeZoneOffsetString(systemTimeZoneIdentifier)으로 둡니다.
  4. 그렇지 않으면,
    1. possibleInstants를 GetNamedTimeZoneEpochNanoseconds(systemTimeZoneIdentifier, YearFromTime(t), MonthFromTime(t) + 1, DateFromTime(t), HourFromTime(t), MinuteFromTime(t), SecondFromTime(t), MillisecondFromTime(t), 0, 0)으로 둡니다.
    2. 참고: 다음 단계는 t가 음의 시간대 전이에서 여러 번 반복되는 로컬 시간(예: 일광 절약 시간이 끝나거나 시간대 규칙 변경으로 시간대 오프셋이 감소하는 경우) 또는 양의 시간대 전이에서 건너뛴 로컬 시간(예: 일광 절약 시간이 시작되거나 시간대 규칙 변경으로 시간대 오프셋이 증가하는 경우)을 나타낼 때 t가 전이 이전의 시간대 오프셋을 사용하여 해석되도록 보장합니다.
    3. possibleInstants가 비어 있지 않으면, 다음을 수행합니다.
      1. disambiguatedInstant를 possibleInstants[0]으로 둡니다.
    4. 그렇지 않으면,
      1. 참고: t는 양의 시간대 전이에서 건너뛴 로컬 시간을 나타냅니다(예: 일광 절약 시간이 시작되거나 시간대 규칙 변경으로 UTC 오프셋이 증가하는 경우).
      2. possibleInstantsBefore를 GetNamedTimeZoneEpochNanoseconds(systemTimeZoneIdentifier, YearFromTime(tBefore), MonthFromTime(tBefore) + 1, DateFromTime(tBefore), HourFromTime(tBefore), MinuteFromTime(tBefore), SecondFromTime(tBefore), MillisecondFromTime(tBefore), 0, 0)으로 둡니다. 여기서 tBefore는 possibleInstantsBefore가 비어 있지 않은(즉, tBefore가 전이 이전의 마지막 로컬 시간을 나타내는) 가장 큰 정수 Number < t입니다.
      3. disambiguatedInstant를 possibleInstantsBefore의 마지막 요소로 둡니다.
    5. offsetNanoseconds를 GetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, disambiguatedInstant)로 둡니다.
  5. offsetMilliseconds를 truncate(offsetNanoseconds / NanosecondsPerMillisecond)로 둡니다.
  6. t - 𝔽(offsetMilliseconds)를 반환합니다.

입력 t는 명목상 시간 값이지만 어떤 Number 값이든 될 수 있습니다. 로컬 UTC 오프셋과 관계없이 시간 값 범위의 경계에 대응하는 입력을 지원할 수 있도록 알고리즘은 t를 시간 값 범위로 제한해서는 안 됩니다. 예를 들어 최대 시간 값은 8.64 × 1015이며 "+275760-09-13T00:00:00Z"에 대응합니다. 해당 순간에 로컬 시간대 오프셋이 UTC보다 1시간 앞선 환경에서는 8.64 × 1015 + 3.6 × 106이라는 더 큰 입력으로 나타내며, 이는 "+275760-09-13T01:00:00+01:00"에 대응합니다.

로컬 시간 t에 대한 정치적 규칙을 구현체 안에서 사용할 수 없으면 SystemTimeZoneIdentifier가 "UTC"를 반환하고 GetNamedTimeZoneOffsetNanoseconds가 0을 반환하므로 결과는 t입니다.

참고 1

시간대 인식 구현체는 IANA Time Zone Database의 시간대 정보를 사용해야 하며, 다른 모든 구현체에도 이를 사용하는 것이 권장됩니다.

America/New_York에서 2017년 11월 5일 오전 1:30은 두 번 반복되지만(시계를 뒤로 돌림), 오전 1:30 UTC-05가 아니라 오전 1:30 UTC-04로 해석해야 합니다. UTC(TimeClip(MakeDate(MakeDay(2017, 10, 5), MakeTime(1, 30, 0, 0))))에서 offsetMilliseconds의 값은 -4 × MillisecondsPerHour입니다.

America/New_York에서 2017년 3월 12일 오전 2:30은 존재하지 않지만 오전 2:30 UTC-05(오전 3:30 UTC-04와 동등)로 해석해야 합니다. UTC(TimeClip(MakeDate(MakeDay(2017, 2, 12), MakeTime(2, 30, 0, 0))))에서 offsetMilliseconds의 값은 -5 × MillisecondsPerHour입니다.

참고 2

UTC(LocalTime(tUTC))은 반드시 항상 tUTC과 같지는 않습니다. 마찬가지로 LocalTime(UTC(tlocal))도 반드시 항상 tlocal과 같지는 않습니다.

21.4.1.27 MakeTime ( hour, minute, second, millisecond )

추상 연산 MakeTime. 인수 hour (Number), minute (Number), second (Number) 및 millisecond (Number). 반환값: Number. 밀리초 수를 계산합니다. 호출되면 다음 단계를 수행한다.

  1. hour가 유한 Number가 아니거나, minute이 유한 Number가 아니거나, second가 유한 Number가 아니거나, millisecond가 유한 Number가 아니면 NaN을 반환합니다.
  2. hourMV를 ! ToIntegerOrInfinity(hour)로 둡니다.
  3. minuteMV를 ! ToIntegerOrInfinity(minute)로 둡니다.
  4. secondMV를 ! ToIntegerOrInfinity(second)로 둡니다.
  5. millisecondMV를 ! ToIntegerOrInfinity(millisecond)로 둡니다.
  6. ((𝔽(hourMV) × 𝔽(MillisecondsPerHour) + 𝔽(minuteMV) × 𝔽(MillisecondsPerMinute)) + 𝔽(secondMV) × 𝔽(MillisecondsPerSecond)) + 𝔽(millisecondMV)를 반환합니다.
참고

MakeTime의 산술은 결합법칙이 성립하지 않는 부동 소수점 산술이므로 연산을 올바른 순서로 수행해야 합니다.

21.4.1.28 MakeDay ( year, month, day )

추상 연산 MakeDay. 인수 year (Number), month (Number) 및 day (Number). 반환값: (a finite Number 또는 NaN). 날짜 수를 계산합니다. 호출되면 다음 단계를 수행한다.

  1. year가 유한 Number가 아니거나, month가 유한 Number가 아니거나, day가 유한 Number가 아니면 NaN을 반환합니다.
  2. yearMV를 ! ToIntegerOrInfinity(year)로 둡니다.
  3. monthMV를 ! ToIntegerOrInfinity(month)로 둡니다.
  4. dayMV를 ! ToIntegerOrInfinity(day)로 둡니다.
  5. balancedYear를 𝔽(yearMV) + 𝔽(floor(monthMV / 12))로 둡니다.
  6. balancedYear가 유한 Number가 아니면 NaN을 반환합니다.
  7. balancedMonthMV를 monthMV modulo 12로 둡니다.
  8. YearFromTime(tv) = ℝ(balancedYear), MonthFromTime(tv) = balancedMonthMV, DateFromTime(tv) = 1을 만족하는 유한 시간 값 tv를 찾습니다. 단, 이것이 가능하지 않으면(일부 인수가 범위를 벗어나기 때문에) NaN을 반환합니다.
  9. 𝔽(Day(tv)) + 𝔽(dayMV) - 1𝔽을 반환합니다.

21.4.1.29 MakeDate ( day, time )

추상 연산 MakeDate. 인수 day (Number) 및 time (Number). 반환값: (a finite Number 또는 NaN). 밀리초 수를 계산합니다. 호출되면 다음 단계를 수행한다.

  1. day가 유한 Number가 아니거나 time이 유한 Number가 아니면 NaN을 반환합니다.
  2. tv를 day × 𝔽(MillisecondsPerDay) + time으로 둡니다.
  3. tv가 유한 Number가 아니면 NaN을 반환합니다.
  4. tv를 반환합니다.

21.4.1.30 MakeFullYear ( year )

추상 연산 MakeFullYear. 인수 year (Number). 반환값: (정수인 Number 또는 NaN). year의 정수 부분과 연결된 전체 연도를 반환하며, 0부터 99까지의 폐구간에 속하는 값은 1900년 시작 이후 경과한 연도 수로 해석합니다. 역산 그레고리력과 맞추기 위해 “전체 연도”는 연도 0(기원전 1년)의 시작 이후 완료된 연도의 부호 있는 수로 정의됩니다. 호출되면 다음 단계를 수행한다.

  1. year가 NaN, +∞𝔽 또는 -∞𝔽 중 하나이면 NaN을 반환합니다.
  2. truncated를 ! ToIntegerOrInfinity(year)로 둡니다.
  3. truncated가 0부터 99까지의 폐구간에 속하면 1900𝔽 + 𝔽(truncated)를 반환합니다.
  4. 𝔽(truncated)를 반환합니다.

21.4.1.31 TimeClip ( time )

추상 연산 TimeClip. 인수 time (Number). 반환값: a time value. 밀리초 수를 계산합니다. 호출되면 다음 단계를 수행한다.

  1. time가 유한 Number가 아니면 NaN을 반환합니다.
  2. abs(ℝ(time)) > 8.64 × 1015이면 NaN을 반환합니다.
  3. 𝔽(! ToIntegerOrInfinity(time))를 반환합니다.

21.4.1.32 날짜 시간 문자열 형식

ECMAScript는 ISO 8601 달력 날짜 확장 형식에서 변형된 날짜-시간 문자열 교환 형식을 정의합니다. 형식은 다음과 같습니다: YYYY-MM-DDTHH:mm:ss.sssZ

각 요소는 다음과 같습니다:

YYYY 역산 그레고리력의 연도를 0000부터 9999까지의 네 자리 십진수로 나타내거나, "+" 또는 "-" 뒤에 여섯 자리 십진수가 이어지는 확장 연도로 나타냅니다.
- "-" (하이픈)은 문자열에 문자 그대로 두 번 나타납니다.
MM 01(1월)부터 12(12월)까지 두 자리 십진수로 나타내는 연중 월입니다.
DD 01부터 31까지 두 자리 십진수로 나타내는 월중 날짜입니다.
T 시간 요소의 시작을 나타내기 위해 "T"가 문자열에 문자 그대로 나타납니다.
HH 자정 이후 지나간 완전한 시간 수를 00부터 24까지 두 자리 십진수로 나타냅니다.
: ":" (콜론)이 문자열에 문자 그대로 두 번 나타납니다.
mm 시가 시작된 이후 지나간 완전한 분의 수를 00부터 59까지 두 자리 십진수로 나타냅니다.
ss 분이 시작된 이후 지나간 완전한 초의 수를 00부터 59까지 두 자리 십진수로 나타냅니다.
. "." (점)이 문자열에 문자 그대로 나타납니다.
sss 초가 시작된 이후 지나간 완전한 밀리초 수를 세 자리 십진수로 나타냅니다.
Z "Z" (오프셋이 없는 UTC) 또는 "+"나 "-" 뒤에 시간 표현 HH:mm이 이어지는 형식으로 지정되는 UTC 오프셋 표현입니다(각각 UTC보다 앞서거나 뒤처진 로컬 시간을 나타내기 위한 시간대 오프셋 문자열 형식의 부분 집합).

이 형식에는 날짜 전용 형식도 포함됩니다:

YYYY
YYYY-MM
YYYY-MM-DD
        

또한 위 날짜 전용 형식 중 하나 바로 뒤에 다음 시간 형식 중 하나가 이어지고 선택적으로 UTC 오프셋 표현이 추가되는 “날짜-시간” 형식도 포함됩니다:

THH:mm
THH:mm:ss
THH:mm:ss.sss
        

범위를 벗어나거나 형식에 맞지 않는 요소를 포함하는 문자열은 이 형식의 유효한 인스턴스가 아닙니다.

참고 1

모든 날은 자정에 시작하고 자정에 끝나므로 하나의 날짜와 연결될 수 있는 두 자정을 구별하기 위해 00:00과 24:00이라는 두 표기법을 사용할 수 있습니다. 따라서 1995-02-04T24:00과 1995-02-05T00:00이라는 다음 두 표기법은 정확히 동일한 시점을 가리킵니다.

참고 2

이 형식은 RFC 9557에 정의된 시간대 이름 주석을 지원하지 않으며, 시간대 오프셋의 숫자 표현만 지원합니다.

21.4.1.32.1 확장 연도

1970년 1월 1일을 기준으로 앞뒤 약 273,790년의 전체 시간 값 범위(21.4.1.1)를 다루려면 0 이전 또는 9999 이후의 연도를 나타내야 합니다. ISO 8601은 연도 표현의 확장을 허용하지만 정보 교환 당사자 간의 상호 합의가 있는 경우에만 허용합니다. 단순화된 ECMAScript 형식에서 이러한 확장 연도 표현은 6자리 숫자를 가져야 하며 항상 + 또는 - 부호가 앞에 붙습니다. 연도 0은 양수로 간주되며 + 부호가 앞에 붙어야 합니다. 연도 0을 -000000으로 나타내는 것은 유효하지 않습니다. 확장 연도를 사용하여 시간 값 범위 밖의 순간을 나타내며 날짜 시간 문자열 형식과 일치하는 문자열은 Date.parse에서 인식할 수 없는 것으로 취급되며, 이 함수는 구현체 고유 동작이나 휴리스틱으로 대체하지 않고 NaN을 반환합니다.

참고

확장 연도를 사용하는 날짜-시간 값의 예:

-271821-04-20T00:00:00Z 기원전 271822년
-000001-01-01T00:00:00Z 기원전 2년
+000000-01-01T00:00:00Z 기원전 1년
+000001-01-01T00:00:00Z 서기 1년
+001970-01-01T00:00:00Z 서기 1970년
+002009-12-15T00:00:00Z 서기 2009년
+275760-09-13T00:00:00Z 서기 275760년

21.4.1.33 시간대 오프셋 문자열 형식

ECMAScript는 ISO 8601에서 파생된 UTC 오프셋용 문자열 교환 형식을 정의합니다. 형식은 다음 문법으로 설명됩니다.

구문

UTCOffset ::: ASCIISign Hour ASCIISign Hour HourSubcomponents[+Extended] ASCIISign Hour HourSubcomponents[~Extended] ASCIISign ::: one of + - Hour ::: 0 DecimalDigit 1 DecimalDigit 20 21 22 23 HourSubcomponents[Extended] ::: TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TemporalDecimalFractionopt TimeSeparator[Extended] ::: [+Extended] : [~Extended] [empty] MinuteSecond ::: 0 DecimalDigit 1 DecimalDigit 2 DecimalDigit 3 DecimalDigit 4 DecimalDigit 5 DecimalDigit TemporalDecimalFraction ::: TemporalDecimalSeparator DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator ::: one of . ,

21.4.1.33.1 IsTimeZoneOffsetString ( offsetString )

추상 연산 IsTimeZoneOffsetString. 인수 offsetString (String). 반환값: Boolean. 반환 값은 offsetString이 UTCOffset이 제시하는 문법을 준수하는지 나타냅니다. 호출되면 다음 단계를 수행한다.

  1. parseResult를 ParseText(offsetString, UTCOffset)로 둡니다.
  2. parseResult가 오류의 List이면 false를 반환합니다.
  3. true를 반환합니다.

21.4.1.33.2 ParseTimeZoneOffsetString ( offsetString )

추상 연산 ParseTimeZoneOffsetString. 인수 offsetString (String). 반환값: 정수. 반환 값은 String offsetString에 대응하는 UTC 오프셋을 나노초 수로 나타낸 것입니다. 호출되면 다음 단계를 수행한다.

  1. parseResult를 ParseText(offsetString, UTCOffset)로 둡니다.
  2. 단언: parseResult는 오류의 List가 아닙니다.
  3. 단언: parseResult에는 ASCIISign Parse Node가 포함되어 있습니다.
  4. parsedSign을 parseResult 안에 포함된 ASCIISign Parse Node와 일치하는 소스 텍스트로 둡니다.
  5. parsedSign이 단일 코드 포인트 U+002D (HYPHEN-MINUS)이면, 다음을 수행합니다.
    1. sign을 -1로 둡니다.
  6. 그렇지 않으면,
    1. sign을 1로 둡니다.
  7. 참고: 아래의 StringToNumber 적용은 파싱된 각 값이 충분히 짧은 십진수 문자열임이 보장되므로 정밀도를 잃지 않습니다.
  8. 단언: parseResult에는 Hour Parse Node가 포함되어 있습니다.
  9. parsedHours를 parseResult 안에 포함된 Hour Parse Node와 일치하는 소스 텍스트로 둡니다.
  10. hours를 ℝ(StringToNumber(CodePointsToString(parsedHours)))로 둡니다.
  11. parseResult에 MinuteSecond Parse Node가 포함되어 있지 않으면, 다음을 수행합니다.
    1. minutes를 0으로 둡니다.
  12. 그렇지 않으면,
    1. parsedMinutes를 parseResult 안에 포함된 첫 번째 MinuteSecond Parse Node와 일치하는 소스 텍스트로 둡니다.
    2. minutes를 ℝ(StringToNumber(CodePointsToString(parsedMinutes)))로 둡니다.
  13. parseResult에 두 개의 MinuteSecond Parse Node가 포함되어 있지 않으면, 다음을 수행합니다.
    1. seconds를 0으로 둡니다.
  14. 그렇지 않으면,
    1. parsedSeconds를 parseResult 안에 포함된 두 번째 MinuteSecond Parse Node와 일치하는 소스 텍스트로 둡니다.
    2. seconds를 ℝ(StringToNumber(CodePointsToString(parsedSeconds)))로 둡니다.
  15. parseResult에 TemporalDecimalFraction Parse Node가 포함되어 있지 않으면, 다음을 수행합니다.
    1. nanoseconds를 0으로 둡니다.
  16. 그렇지 않으면,
    1. parsedFraction을 parseResult 안에 포함된 TemporalDecimalFraction Parse Node와 일치하는 소스 텍스트로 둡니다.
    2. fraction을 CodePointsToString(parsedFraction)과 "000000000"의 문자열 연결로 둡니다.
    3. nanosecondsString을 fraction의 인덱스 1부터 10까지의 부분 문자열로 둡니다.
    4. nanoseconds를 ℝ(StringToNumber(nanosecondsString))로 둡니다.
  17. sign × (((hours × MinutesPerHour + minutes) × SecondsPerMinute + seconds) × NanosecondsPerSecond + nanoseconds)를 반환합니다.

21.4.2 Date 생성자

Date 생성자는:

  • %Date%입니다.
  • 전역 객체의 "Date" 프로퍼티 초기 값입니다.
  • 생성자로 호출되면 새로운 Date를 생성하고 초기화합니다.
  • 생성자가 아니라 함수로 호출되면 현재 시간(UTC)을 나타내는 String을 반환합니다.
  • 인수의 수와 타입에 따라 동작이 달라지는 함수입니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 명시된 Date 동작을 상속하려는 하위 클래스 생성자는 [[DateValue]] 내부 슬롯을 갖는 하위 클래스 인스턴스를 생성하고 초기화하기 위해 Date 생성자에 대한 super 호출을 포함해야 합니다.

21.4.2.1 Date ( ...values )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. NewTarget이 undefined이면, 다음을 수행합니다.
    1. now를 현재 시간을 식별하는 시간 값(UTC)으로 둡니다.
    2. ToDateString(now)을 반환합니다.
  2. numberOfArgs를 values의 요소 수로 둡니다.
  3. numberOfArgs = 0이면, 다음을 수행합니다.
    1. dv를 현재 시간을 식별하는 시간 값(UTC)으로 둡니다.
  4. 그렇지 않고 numberOfArgs = 1이면, 다음을 수행합니다.
    1. value를 values[0]으로 둡니다.
    2. value가 Object이고 value에 [[DateValue]] 내부 슬롯이 있으면, 다음을 수행합니다.
      1. tv를 value.[[DateValue]]로 둡니다.
    3. 그렇지 않으면,
      1. primitive를 ? ToPrimitive(value)로 둡니다.
      2. primitive가 String이면, 다음을 수행합니다.
        1. 단언: primitive가 String이므로 다음 단계는 절대로 비정상 완료를 반환하지 않습니다.
        2. tv를 parse 메서드(21.4.3.2)와 정확히 동일한 방식으로 primitive를 날짜로 파싱한 결과로 둡니다.
      3. 그렇지 않으면,
        1. tv를 ? ToNumber(primitive)로 둡니다.
    4. dv를 TimeClip(tv)로 둡니다.
  5. 그렇지 않으면,
    1. 단언: numberOfArgs ≥ 2입니다.
    2. yearNumber를 ? ToNumber(values[0])으로 둡니다.
    3. monthNumber를 ? ToNumber(values[1])로 둡니다.
    4. numberOfArgs > 2이면 dayNumber를 ? ToNumber(values[2])로 둡니다. 그렇지 않으면 dayNumber를 1𝔽로 둡니다.
    5. numberOfArgs > 3이면 hourNumber를 ? ToNumber(values[3])로 둡니다. 그렇지 않으면 hourNumber를 +0𝔽으로 둡니다.
    6. numberOfArgs > 4이면 minuteNumber를 ? ToNumber(values[4])로 둡니다. 그렇지 않으면 minuteNumber를 +0𝔽으로 둡니다.
    7. numberOfArgs > 5이면 secondNumber를 ? ToNumber(values[5])로 둡니다. 그렇지 않으면 secondNumber를 +0𝔽으로 둡니다.
    8. numberOfArgs > 6이면 millisecondNumber를 ? ToNumber(values[6])로 둡니다. 그렇지 않으면 millisecondNumber를 +0𝔽으로 둡니다.
    9. yearNumber를 MakeFullYear(yearNumber)로 설정합니다.
    10. finalDate를 MakeDate(MakeDay(yearNumber, monthNumber, dayNumber), MakeTime(hourNumber, minuteNumber, secondNumber, millisecondNumber))로 둡니다.
    11. dv를 TimeClip(UTC(finalDate))로 둡니다.
  6. obj를 ? OrdinaryCreateFromConstructor(NewTarget, "%Date.prototype%", « [[DateValue]] »)로 둡니다.
  7. obj.[[DateValue]]를 dv로 설정합니다.
  8. obj를 반환합니다.

21.4.3 Date 생성자의 프로퍼티

Date 생성자는:

  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 값이 7𝔽인 "length" 프로퍼티를 갖습니다.
  • 다음 프로퍼티를 갖습니다:

21.4.3.1 Date.now ( )

이 함수는 호출이 발생한 UTC 날짜와 시간을 지정하는 시간 값을 반환합니다.

21.4.3.2 Date.parse ( string )

이 함수는 인수에 ToString 연산자를 적용합니다. ToString이 비정상 완료를 생성하면 해당 Completion Record를 즉시 반환합니다. 그렇지 않으면 이 함수는 결과 String을 날짜와 시간으로 해석하고, 해당 날짜와 시간에 대응하는 UTC 시간 값인 Number를 반환합니다. String의 내용에 따라 String은 로컬 시간, UTC 시간 또는 다른 시간대의 시간으로 해석될 수 있습니다. 함수는 먼저 확장 연도를 포함하여 날짜 시간 문자열 형식(21.4.1.32)에 설명된 형식에 따라 String을 파싱하려고 합니다. String이 해당 형식을 준수하지 않으면 함수는 구현체 고유 휴리스틱 또는 구현체 고유 날짜 형식으로 대체할 수 있습니다. 인식할 수 없거나 범위를 벗어난 형식 요소 값을 포함하는 String은 이 함수가 NaN을 반환하게 해야 합니다.

String이 날짜 시간 문자열 형식을 준수하면 존재하지 않는 형식 요소 대신 대체 값이 사용됩니다. MM 또는 DD 요소가 없으면 "01"을 사용합니다. HH, mm 또는 ss 요소가 없으면 "00"을 사용합니다. sss 요소가 없으면 "000"을 사용합니다. UTC 오프셋 표현이 없으면 날짜 전용 형식은 UTC 시간으로 해석하고 날짜-시간 형식은 로컬 시간으로 해석합니다.

x가 특정 ECMAScript 구현체에서 밀리초 값이 0인 임의의 Date이고 참조되는 모든 프로퍼티가 초기 값을 갖는다면 다음 표현식은 모두 해당 구현체에서 동일한 숫자 값을 생성해야 합니다:

x.valueOf()
Date.parse(x.toString())
Date.parse(x.toUTCString())
Date.parse(x.toISOString())

그러나 다음 표현식은

Date.parse(x.toLocaleString())

앞의 세 표현식과 동일한 Number 값을 생성해야 할 필요가 없으며, 일반적으로 날짜 시간 문자열 형식을 준수하지 않고 해당 구현체의 toString 또는 toUTCString 메서드가 생성할 수도 없는 임의의 String 값이 주어지면 이 함수가 생성하는 값은 구현체 정의입니다.

21.4.3.3 Date.prototype

Date.prototype의 초기 값은 Date 프로토타입 객체입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

21.4.3.4 Date.UTC ( year [ , month [ , day [ , hour [ , minute [ , second [ , millisecond ] ] ] ] ] ] )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. yearNumber를 ? ToNumber(year)로 둡니다.
  2. month가 존재하면 monthNumber를 ? ToNumber(month)로 둡니다. 그렇지 않으면 monthNumber를 +0𝔽으로 둡니다.
  3. day가 존재하면 dayNumber를 ? ToNumber(day)로 둡니다. 그렇지 않으면 dayNumber를 1𝔽로 둡니다.
  4. hour가 존재하면 hourNumber를 ? ToNumber(hour)로 둡니다. 그렇지 않으면 hourNumber를 +0𝔽으로 둡니다.
  5. minute이 존재하면 minuteNumber를 ? ToNumber(minute)로 둡니다. 그렇지 않으면 minuteNumber를 +0𝔽으로 둡니다.
  6. second가 존재하면 secondNumber를 ? ToNumber(second)로 둡니다. 그렇지 않으면 secondNumber를 +0𝔽으로 둡니다.
  7. millisecond가 존재하면 millisecondNumber를 ? ToNumber(millisecond)로 둡니다. 그렇지 않으면 millisecondNumber를 +0𝔽으로 둡니다.
  8. yearNumber를 MakeFullYear(yearNumber)로 설정합니다.
  9. TimeClip(MakeDate(MakeDay(yearNumber, monthNumber, dayNumber), MakeTime(hourNumber, minuteNumber, secondNumber, millisecondNumber)))을 반환합니다.

이 함수의 "length" 프로퍼티는 7𝔽입니다.

참고

이 함수는 두 가지 점에서 Date 생성자와 다릅니다. Date를 생성하는 대신 시간 값을 Number로 반환하며, 인수를 로컬 시간이 아니라 UTC로 해석합니다.

21.4.4 Date 프로토타입 객체의 프로퍼티

Date 프로토타입 객체는:

  • %Date.prototype%입니다.
  • 그 자체가 일반 객체입니다.
  • Date 인스턴스가 아니며 [[DateValue]] 내부 슬롯을 갖지 않습니다.
  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.

명시적으로 달리 정의되지 않는 한 아래에 정의된 Date 프로토타입 객체의 메서드는 일반적이지 않으며, 메서드에 전달되는 this 값은 시간 값으로 초기화된 [[DateValue]] 내부 슬롯을 갖는 객체여야 합니다.

21.4.4.1 Date.prototype.constructor

Date.prototype.constructor의 초기 값은 %Date%입니다.

21.4.4.2 Date.prototype.getDate ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(DateFromTime(LocalTime(tv)))을 반환합니다.

21.4.4.3 Date.prototype.getDay ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(WeekDay(LocalTime(tv)))를 반환합니다.

21.4.4.4 Date.prototype.getFullYear ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(YearFromTime(LocalTime(tv)))를 반환합니다.

21.4.4.5 Date.prototype.getHours ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(HourFromTime(LocalTime(tv)))을 반환합니다.

21.4.4.6 Date.prototype.getMilliseconds ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(MillisecondFromTime(LocalTime(tv)))을 반환합니다.

21.4.4.7 Date.prototype.getMinutes ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(MinuteFromTime(LocalTime(tv)))를 반환합니다.

21.4.4.8 Date.prototype.getMonth ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(MonthFromTime(LocalTime(tv)))를 반환합니다.

21.4.4.9 Date.prototype.getSeconds ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(SecondFromTime(LocalTime(tv)))를 반환합니다.

21.4.4.10 Date.prototype.getTime ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. dateObj.[[DateValue]]를 반환합니다.

21.4.4.11 Date.prototype.getTimezoneOffset ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. (tv - LocalTime(tv)) / 𝔽(MillisecondsPerMinute)를 반환합니다.

21.4.4.12 Date.prototype.getUTCDate ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(DateFromTime(tv))를 반환합니다.

21.4.4.13 Date.prototype.getUTCDay ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(WeekDay(tv))를 반환합니다.

21.4.4.14 Date.prototype.getUTCFullYear ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(YearFromTime(tv))를 반환합니다.

21.4.4.15 Date.prototype.getUTCHours ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(HourFromTime(tv))를 반환합니다.

21.4.4.16 Date.prototype.getUTCMilliseconds ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(MillisecondFromTime(tv))를 반환합니다.

21.4.4.17 Date.prototype.getUTCMinutes ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(MinuteFromTime(tv))를 반환합니다.

21.4.4.18 Date.prototype.getUTCMonth ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(MonthFromTime(tv))를 반환합니다.

21.4.4.19 Date.prototype.getUTCSeconds ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 NaN을 반환합니다.
  5. 𝔽(SecondFromTime(tv))를 반환합니다.

21.4.4.20 Date.prototype.setDate ( day )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. dayNumber를 ? ToNumber(day)로 둡니다.
  5. tv가 NaN이면 NaN을 반환합니다.
  6. tv를 LocalTime(tv)로 설정합니다.
  7. newDate를 MakeDate(MakeDay(𝔽(YearFromTime(tv)), 𝔽(MonthFromTime(tv)), dayNumber), 𝔽(TimeWithinDay(tv)))로 둡니다.
  8. u를 TimeClip(UTC(newDate))로 둡니다.
  9. dateObj.[[DateValue]]를 u로 설정합니다.
  10. u를 반환합니다.

21.4.4.21 Date.prototype.setFullYear ( year [ , month [ , day ] ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. yearNumber를 ? ToNumber(year)로 둡니다.
  5. tv가 NaN이면 tv를 +0𝔽으로 설정합니다. 그렇지 않으면 tv를 LocalTime(tv)로 설정합니다.
  6. month가 존재하면 monthNumber를 ? ToNumber(month)로 둡니다. 그렇지 않으면 monthNumber를 𝔽(MonthFromTime(tv))로 둡니다.
  7. day가 존재하면 dayNumber를 ? ToNumber(day)로 둡니다. 그렇지 않으면 dayNumber를 𝔽(DateFromTime(tv))로 둡니다.
  8. newDate를 MakeDate(MakeDay(yearNumber, monthNumber, dayNumber), 𝔽(TimeWithinDay(tv)))로 둡니다.
  9. u를 TimeClip(UTC(newDate))로 둡니다.
  10. dateObj.[[DateValue]]를 u로 설정합니다.
  11. u를 반환합니다.

이 메서드의 "length" 프로퍼티는 3𝔽입니다.

참고

month가 존재하지 않으면 이 메서드는 month가 getMonth() 값으로 존재했던 것처럼 동작합니다. day가 존재하지 않으면 day가 getDate() 값으로 존재했던 것처럼 동작합니다.

21.4.4.22 Date.prototype.setHours ( hour [ , minute [ , second [ , millisecond ] ] ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. hourNumber를 ? ToNumber(hour)로 둡니다.
  5. minute이 존재하면 minuteNumber를 ? ToNumber(minute)로 둡니다.
  6. second가 존재하면 secondNumber를 ? ToNumber(second)로 둡니다.
  7. millisecond가 존재하면 millisecondNumber를 ? ToNumber(millisecond)로 둡니다.
  8. tv가 NaN이면 NaN을 반환합니다.
  9. tv를 LocalTime(tv)로 설정합니다.
  10. minute이 존재하지 않으면 minuteNumber를 𝔽(MinuteFromTime(tv))로 둡니다.
  11. second가 존재하지 않으면 secondNumber를 𝔽(SecondFromTime(tv))로 둡니다.
  12. millisecond가 존재하지 않으면 millisecondNumber를 𝔽(MillisecondFromTime(tv))로 둡니다.
  13. date를 MakeDate(𝔽(Day(tv)), MakeTime(hourNumber, minuteNumber, secondNumber, millisecondNumber))로 둡니다.
  14. u를 TimeClip(UTC(date))로 둡니다.
  15. dateObj.[[DateValue]]를 u로 설정합니다.
  16. u를 반환합니다.

이 메서드의 "length" 프로퍼티는 4𝔽입니다.

참고

minute이 존재하지 않으면 이 메서드는 minute이 getMinutes() 값으로 존재했던 것처럼 동작합니다. second가 존재하지 않으면 second가 getSeconds() 값으로 존재했던 것처럼 동작합니다. millisecond가 존재하지 않으면 millisecond가 getMilliseconds() 값으로 존재했던 것처럼 동작합니다.

21.4.4.23 Date.prototype.setMilliseconds ( millisecond )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. millisecondNumber를 ? ToNumber(millisecond)로 둡니다.
  5. tv가 NaN이면 NaN을 반환합니다.
  6. tv를 LocalTime(tv)로 설정합니다.
  7. time을 MakeTime(𝔽(HourFromTime(tv)), 𝔽(MinuteFromTime(tv)), 𝔽(SecondFromTime(tv)), millisecondNumber)로 둡니다.
  8. u를 TimeClip(UTC(MakeDate(𝔽(Day(tv)), time)))로 둡니다.
  9. dateObj.[[DateValue]]를 u로 설정합니다.
  10. u를 반환합니다.

21.4.4.24 Date.prototype.setMinutes ( minute [ , second [ , millisecond ] ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. minuteNumber를 ? ToNumber(minute)로 둡니다.
  5. second가 존재하면 secondNumber를 ? ToNumber(second)로 둡니다.
  6. millisecond가 존재하면 millisecondNumber를 ? ToNumber(millisecond)로 둡니다.
  7. tv가 NaN이면 NaN을 반환합니다.
  8. tv를 LocalTime(tv)로 설정합니다.
  9. second가 존재하지 않으면 secondNumber를 𝔽(SecondFromTime(tv))로 둡니다.
  10. millisecond가 존재하지 않으면 millisecondNumber를 𝔽(MillisecondFromTime(tv))로 둡니다.
  11. date를 MakeDate(𝔽(Day(tv)), MakeTime(𝔽(HourFromTime(tv)), minuteNumber, secondNumber, millisecondNumber))로 둡니다.
  12. u를 TimeClip(UTC(date))로 둡니다.
  13. dateObj.[[DateValue]]를 u로 설정합니다.
  14. u를 반환합니다.

이 메서드의 "length" 프로퍼티는 3𝔽입니다.

참고

second가 존재하지 않으면 이 메서드는 second가 getSeconds() 값으로 존재했던 것처럼 동작합니다. millisecond가 존재하지 않으면 millisecond가 getMilliseconds() 값으로 존재했던 것처럼 동작합니다.

21.4.4.25 Date.prototype.setMonth ( month [ , day ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. monthNumber를 ? ToNumber(month)로 둡니다.
  5. day가 존재하면 dayNumber를 ? ToNumber(day)로 둡니다.
  6. tv가 NaN이면 NaN을 반환합니다.
  7. tv를 LocalTime(tv)로 설정합니다.
  8. day가 존재하지 않으면 dayNumber를 𝔽(DateFromTime(tv))로 둡니다.
  9. newDate를 MakeDate(MakeDay(𝔽(YearFromTime(tv)), monthNumber, dayNumber), 𝔽(TimeWithinDay(tv)))로 둡니다.
  10. u를 TimeClip(UTC(newDate))로 둡니다.
  11. dateObj.[[DateValue]]를 u로 설정합니다.
  12. u를 반환합니다.

이 메서드의 "length" 프로퍼티는 2𝔽입니다.

참고

day가 존재하지 않으면 이 메서드는 day가 getDate() 값으로 존재했던 것처럼 동작합니다.

21.4.4.26 Date.prototype.setSeconds ( second [ , millisecond ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. secondNumber를 ? ToNumber(second)로 둡니다.
  5. millisecond가 존재하면 millisecondNumber를 ? ToNumber(millisecond)로 둡니다.
  6. tv가 NaN이면 NaN을 반환합니다.
  7. tv를 LocalTime(tv)로 설정합니다.
  8. millisecond가 존재하지 않으면 millisecondNumber를 𝔽(MillisecondFromTime(tv))로 둡니다.
  9. date를 MakeDate(𝔽(Day(tv)), MakeTime(𝔽(HourFromTime(tv)), 𝔽(MinuteFromTime(tv)), secondNumber, millisecondNumber))로 둡니다.
  10. u를 TimeClip(UTC(date))로 둡니다.
  11. dateObj.[[DateValue]]를 u로 설정합니다.
  12. u를 반환합니다.

이 메서드의 "length" 프로퍼티는 2𝔽입니다.

참고

millisecond가 존재하지 않으면 이 메서드는 millisecond가 getMilliseconds() 값으로 존재했던 것처럼 동작합니다.

21.4.4.27 Date.prototype.setTime ( time )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. t를 ? ToNumber(time)로 둡니다.
  4. v를 TimeClip(t)로 둡니다.
  5. dateObj.[[DateValue]]를 v로 설정합니다.
  6. v를 반환합니다.

21.4.4.28 Date.prototype.setUTCDate ( day )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. dayNumber를 ? ToNumber(day)로 둡니다.
  5. tv가 NaN이면 NaN을 반환합니다.
  6. newDate를 MakeDate(MakeDay(𝔽(YearFromTime(tv)), 𝔽(MonthFromTime(tv)), dayNumber), 𝔽(TimeWithinDay(tv)))로 둡니다.
  7. v를 TimeClip(newDate)로 둡니다.
  8. dateObj.[[DateValue]]를 v로 설정합니다.
  9. v를 반환합니다.

21.4.4.29 Date.prototype.setUTCFullYear ( year [ , month [ , day ] ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 tv를 +0𝔽으로 설정합니다.
  5. yearNumber를 ? ToNumber(year)로 둡니다.
  6. month가 존재하면 monthNumber를 ? ToNumber(month)로 둡니다. 그렇지 않으면 monthNumber를 𝔽(MonthFromTime(tv))로 둡니다.
  7. day가 존재하면 dayNumber를 ? ToNumber(day)로 둡니다. 그렇지 않으면 dayNumber를 𝔽(DateFromTime(tv))로 둡니다.
  8. newDate를 MakeDate(MakeDay(yearNumber, monthNumber, dayNumber), 𝔽(TimeWithinDay(tv)))로 둡니다.
  9. v를 TimeClip(newDate)로 둡니다.
  10. dateObj.[[DateValue]]를 v로 설정합니다.
  11. v를 반환합니다.

이 메서드의 "length" 프로퍼티는 3𝔽입니다.

참고

month가 존재하지 않으면 이 메서드는 month가 getUTCMonth() 값으로 존재했던 것처럼 동작합니다. day가 존재하지 않으면 day가 getUTCDate() 값으로 존재했던 것처럼 동작합니다.

21.4.4.30 Date.prototype.setUTCHours ( hour [ , minute [ , second [ , millisecond ] ] ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. hourNumber를 ? ToNumber(hour)로 둡니다.
  5. minute이 존재하면 minuteNumber를 ? ToNumber(minute)로 둡니다.
  6. second가 존재하면 secondNumber를 ? ToNumber(second)로 둡니다.
  7. millisecond가 존재하면 millisecondNumber를 ? ToNumber(millisecond)로 둡니다.
  8. tv가 NaN이면 NaN을 반환합니다.
  9. minute이 존재하지 않으면 minuteNumber를 𝔽(MinuteFromTime(tv))로 둡니다.
  10. second가 존재하지 않으면 secondNumber를 𝔽(SecondFromTime(tv))로 둡니다.
  11. millisecond가 존재하지 않으면 millisecondNumber를 𝔽(MillisecondFromTime(tv))로 둡니다.
  12. date를 MakeDate(𝔽(Day(tv)), MakeTime(hourNumber, minuteNumber, secondNumber, millisecondNumber))로 둡니다.
  13. v를 TimeClip(date)로 둡니다.
  14. dateObj.[[DateValue]]를 v로 설정합니다.
  15. v를 반환합니다.

이 메서드의 "length" 프로퍼티는 4𝔽입니다.

참고

minute이 존재하지 않으면 이 메서드는 minute이 getUTCMinutes() 값으로 존재했던 것처럼 동작합니다. second가 존재하지 않으면 second가 getUTCSeconds() 값으로 존재했던 것처럼 동작합니다. millisecond가 존재하지 않으면 millisecond가 getUTCMilliseconds() 값으로 존재했던 것처럼 동작합니다.

21.4.4.31 Date.prototype.setUTCMilliseconds ( millisecond )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. millisecondNumber를 ? ToNumber(millisecond)로 둡니다.
  5. tv가 NaN이면 NaN을 반환합니다.
  6. time을 MakeTime(𝔽(HourFromTime(tv)), 𝔽(MinuteFromTime(tv)), 𝔽(SecondFromTime(tv)), millisecondNumber)로 둡니다.
  7. v를 TimeClip(MakeDate(𝔽(Day(tv)), time))로 둡니다.
  8. dateObj.[[DateValue]]를 v로 설정합니다.
  9. v를 반환합니다.

21.4.4.32 Date.prototype.setUTCMinutes ( minute [ , second [ , millisecond ] ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. minuteNumber를 ? ToNumber(minute)로 둡니다.
  5. second가 존재하면 secondNumber를 ? ToNumber(second)로 둡니다.
  6. millisecond가 존재하면 millisecondNumber를 ? ToNumber(millisecond)로 둡니다.
  7. tv가 NaN이면 NaN을 반환합니다.
  8. second가 존재하지 않으면 secondNumber를 𝔽(SecondFromTime(tv))로 둡니다.
  9. millisecond가 존재하지 않으면 millisecondNumber를 𝔽(MillisecondFromTime(tv))로 둡니다.
  10. date를 MakeDate(𝔽(Day(tv)), MakeTime(𝔽(HourFromTime(tv)), minuteNumber, secondNumber, millisecondNumber))로 둡니다.
  11. v를 TimeClip(date)로 둡니다.
  12. dateObj.[[DateValue]]를 v로 설정합니다.
  13. v를 반환합니다.

이 메서드의 "length" 프로퍼티는 3𝔽입니다.

참고

second가 존재하지 않으면 이 메서드는 second가 getUTCSeconds() 값으로 존재했던 것처럼 동작합니다. millisecond가 존재하지 않으면 이 메서드는 millisecond가 getUTCMilliseconds()가 반환하는 값으로 존재했던 것처럼 동작합니다.

21.4.4.33 Date.prototype.setUTCMonth ( month [ , day ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. monthNumber를 ? ToNumber(month)로 둡니다.
  5. day가 존재하면 dayNumber를 ? ToNumber(day)로 둡니다.
  6. tv가 NaN이면 NaN을 반환합니다.
  7. day가 존재하지 않으면 dayNumber를 𝔽(DateFromTime(tv))로 둡니다.
  8. newDate를 MakeDate(MakeDay(𝔽(YearFromTime(tv)), monthNumber, dayNumber), 𝔽(TimeWithinDay(tv)))로 둡니다.
  9. v를 TimeClip(newDate)로 둡니다.
  10. dateObj.[[DateValue]]를 v로 설정합니다.
  11. v를 반환합니다.

이 메서드의 "length" 프로퍼티는 2𝔽입니다.

참고

day가 존재하지 않으면 이 메서드는 day가 getUTCDate() 값으로 존재했던 것처럼 동작합니다.

21.4.4.34 Date.prototype.setUTCSeconds ( second [ , millisecond ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. secondNumber를 ? ToNumber(second)로 둡니다.
  5. millisecond가 존재하면 millisecondNumber를 ? ToNumber(millisecond)로 둡니다.
  6. tv가 NaN이면 NaN을 반환합니다.
  7. millisecond가 존재하지 않으면 millisecondNumber를 𝔽(MillisecondFromTime(tv))로 둡니다.
  8. date를 MakeDate(𝔽(Day(tv)), MakeTime(𝔽(HourFromTime(tv)), 𝔽(MinuteFromTime(tv)), secondNumber, millisecondNumber))로 둡니다.
  9. v를 TimeClip(date)로 둡니다.
  10. dateObj.[[DateValue]]를 v로 설정합니다.
  11. v를 반환합니다.

이 메서드의 "length" 프로퍼티는 2𝔽입니다.

참고

millisecond가 존재하지 않으면 이 메서드는 millisecond가 getUTCMilliseconds() 값으로 존재했던 것처럼 동작합니다.

21.4.4.35 Date.prototype.toDateString ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 "Invalid Date"를 반환합니다.
  5. t를 LocalTime(tv)로 둡니다.
  6. DateString(t)을 반환합니다.

21.4.4.36 Date.prototype.toISOString ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 RangeError 예외를 던집니다.
  5. 단언: tv는 정수 Number입니다.
  6. tv가 날짜 시간 문자열 형식으로 나타낼 수 없는 연도에 대응하면 RangeError 예외를 던집니다.
  7. 모든 형식 요소와 UTC 오프셋 표현 "Z"를 포함하여 UTC 시간 척도에서 날짜 시간 문자열 형식으로 tv를 나타내는 String을 반환합니다.

21.4.4.37 Date.prototype.toJSON ( key )

이 메서드는 JSON.stringify(25.5.4)에서 사용하기 위한 Date의 String 표현을 제공합니다.

호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. tv를 ? ToPrimitive(obj, number)로 둡니다.
  3. tv가 Number이고 tv가 유한 Number가 아니면 null을 반환합니다.
  4. ? Invoke(obj, "toISOString")를 반환합니다.
참고 1

인수는 무시됩니다.

참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Date일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다. 다만 그러한 객체에는 toISOString 메서드가 있어야 합니다.

21.4.4.38 Date.prototype.toLocaleDateString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 국제화 API를 포함하는 ECMAScript 구현체는 ECMA-402에 명시된 대로 이 메서드를 구현해야 합니다. 그렇지 않으면 다음과 같은 이 메서드 명세가 사용됩니다:

이 메서드는 String 값을 반환합니다. String의 내용은 구현체 정의이지만 호스트 환경의 현재 로케일 관례에 대응하는 편리하고 사람이 읽을 수 있는 형식으로 현재 시간대에서 Date의 “날짜” 부분을 나타내도록 의도됩니다.

이 메서드의 선택적 매개변수의 의미는 ECMA-402에 정의되어 있습니다. ECMA-402 지원을 포함하지 않는 구현체는 해당 매개변수 위치를 다른 용도로 사용해서는 안 됩니다.

21.4.4.39 Date.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 국제화 API를 포함하는 ECMAScript 구현체는 ECMA-402에 명시된 대로 이 메서드를 구현해야 합니다. 그렇지 않으면 다음과 같은 이 메서드 명세가 사용됩니다:

이 메서드는 String 값을 반환합니다. String의 내용은 구현체 정의이지만 호스트 환경의 현재 로케일 관례에 대응하는 편리하고 사람이 읽을 수 있는 형식으로 현재 시간대의 Date를 나타내도록 의도됩니다.

이 메서드의 선택적 매개변수의 의미는 ECMA-402에 정의되어 있습니다. ECMA-402 지원을 포함하지 않는 구현체는 해당 매개변수 위치를 다른 용도로 사용해서는 안 됩니다.

21.4.4.40 Date.prototype.toLocaleTimeString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 국제화 API를 포함하는 ECMAScript 구현체는 ECMA-402에 명시된 대로 이 메서드를 구현해야 합니다. 그렇지 않으면 다음과 같은 이 메서드 명세가 사용됩니다:

이 메서드는 String 값을 반환합니다. String의 내용은 구현체 정의이지만 호스트 환경의 현재 로케일 관례에 대응하는 편리하고 사람이 읽을 수 있는 형식으로 현재 시간대에서 Date의 “시간” 부분을 나타내도록 의도됩니다.

이 메서드의 선택적 매개변수의 의미는 ECMA-402에 정의되어 있습니다. ECMA-402 지원을 포함하지 않는 구현체는 해당 매개변수 위치를 다른 용도로 사용해서는 안 됩니다.

21.4.4.41 Date.prototype.toString ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. ToDateString(tv)을 반환합니다.
참고 1

d.[[DateValue]]가 1000으로 나누어떨어지는 임의의 Date d에 대해 Date.parse(d.toString()) = d.valueOf()입니다. 21.4.3.2를 참조하시기 바랍니다.

참고 2

이 메서드는 일반적이지 않습니다. this 값이 Date가 아니면 TypeError 예외를 던집니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 없습니다.

21.4.4.41.1 TimeString ( tv )

추상 연산 TimeString. 인수 tv (a Number, but not NaN). 반환값: String. 호출되면 다음 단계를 수행한다.

  1. hour를 ToZeroPaddedDecimalString(HourFromTime(tv), 2)로 둡니다.
  2. minute을 ToZeroPaddedDecimalString(MinuteFromTime(tv), 2)로 둡니다.
  3. second를 ToZeroPaddedDecimalString(SecondFromTime(tv), 2)로 둡니다.
  4. hour, ":", minute, ":", second, 코드 단위 0x0020 (SPACE) 및 "GMT"의 문자열 연결을 반환합니다.

21.4.4.41.2 DateString ( tv )

추상 연산 DateString. 인수 tv (a Number, but not NaN). 반환값: String. 호출되면 다음 단계를 수행한다.

  1. weekday를 WeekDay Index = WeekDay(tv)인 표 61 항목의 Name으로 둡니다.
  2. month를 Month Index = MonthFromTime(tv)인 표 62 항목의 Name으로 둡니다.
  3. day를 ToZeroPaddedDecimalString(DateFromTime(tv), 2)로 둡니다.
  4. yv를 YearFromTime(tv)로 둡니다.
  5. yv ≥ 0이면 yearSign을 빈 String으로 둡니다. 그렇지 않으면 yearSign을 "-"로 둡니다.
  6. paddedYear를 ToZeroPaddedDecimalString(abs(yv), 4)로 둡니다.
  7. weekday, 코드 단위 0x0020 (SPACE), month, 코드 단위 0x0020 (SPACE), day, 코드 단위 0x0020 (SPACE), yearSign 및 paddedYear의 문자열 연결을 반환합니다.
표 61: 요일 이름
WeekDay 인덱스 이름
0 "Sun"
1 "Mon"
2 "Tue"
3 "Wed"
4 "Thu"
5 "Fri"
6 "Sat"
표 62: 연중 월 이름
Month 인덱스 이름
0 "Jan"
1 "Feb"
2 "Mar"
3 "Apr"
4 "May"
5 "Jun"
6 "Jul"
7 "Aug"
8 "Sep"
9 "Oct"
10 "Nov"
11 "Dec"

21.4.4.41.3 TimeZoneString ( tv )

추상 연산 TimeZoneString. 인수 tv (정수인 Number). 반환값: String. 호출되면 다음 단계를 수행한다.

  1. systemTimeZoneIdentifier를 SystemTimeZoneIdentifier()로 둡니다.
  2. IsTimeZoneOffsetString(systemTimeZoneIdentifier)이 true이면, 다음을 수행합니다.
    1. offsetNanoseconds를 ParseTimeZoneOffsetString(systemTimeZoneIdentifier)으로 둡니다.
  3. 그렇지 않으면,
    1. offsetNanoseconds를 GetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, ℝ(tv) × NanosecondsPerMillisecond)로 둡니다.
  4. offsetMilliseconds를 truncate(offsetNanoseconds / NanosecondsPerMillisecond)로 둡니다.
  5. offsetMilliseconds ≥ 0이면, 다음을 수행합니다.
    1. offsetSign을 "+"로 둡니다.
    2. absOffsetMilliseconds를 offsetMilliseconds로 둡니다.
  6. 그렇지 않으면,
    1. offsetSign을 "-"로 둡니다.
    2. absOffsetMilliseconds를 -offsetMilliseconds로 둡니다.
  7. offsetMinute을 ToZeroPaddedDecimalString(MinuteFromTime(𝔽(absOffsetMilliseconds)), 2)로 둡니다.
  8. offsetHour를 ToZeroPaddedDecimalString(HourFromTime(𝔽(absOffsetMilliseconds)), 2)로 둡니다.
  9. timeZoneName을 빈 String 또는 코드 단위 0x0020 (SPACE), 코드 단위 0x0028 (LEFT PARENTHESIS), 구현체 정의 시간대 이름 및 코드 단위 0x0029 (RIGHT PARENTHESIS)의 문자열 연결 중 하나인 구현체 정의 문자열로 둡니다.
  10. offsetSign, offsetHour, offsetMinute 및 timeZoneName의 문자열 연결을 반환합니다.

21.4.4.41.4 ToDateString ( tv )

추상 연산 ToDateString. 인수 tv ((정수인 Number 또는 NaN)). 반환값: String. 호출되면 다음 단계를 수행한다.

  1. tv가 NaN이면 "Invalid Date"를 반환합니다.
  2. localTime을 LocalTime(tv)로 둡니다.
  3. DateString(localTime), 코드 단위 0x0020 (SPACE), TimeString(localTime) 및 TimeZoneString(tv)의 문자열 연결을 반환합니다.

21.4.4.42 Date.prototype.toTimeString ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 "Invalid Date"를 반환합니다.
  5. localTime을 LocalTime(tv)로 둡니다.
  6. TimeString(localTime)과 TimeZoneString(tv)의 문자열 연결을 반환합니다.

21.4.4.43 Date.prototype.toUTCString ( )

이 메서드는 this 값에 대응하는 시간의 순간을 나타내는 String 값을 반환합니다. String 형식은 RFC 7231의 HTTP-date를 기반으로 하며 ECMAScript Date가 지원하는 전체 시간 범위를 지원하도록 일반화되어 있습니다.

호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. tv를 dateObj.[[DateValue]]로 둡니다.
  4. tv가 NaN이면 "Invalid Date"를 반환합니다.
  5. weekday를 WeekDay Index = WeekDay(tv)인 표 61 항목의 Name으로 둡니다.
  6. month를 Month Index = MonthFromTime(tv)인 표 62 항목의 Name으로 둡니다.
  7. day를 ToZeroPaddedDecimalString(DateFromTime(tv), 2)로 둡니다.
  8. yv를 YearFromTime(tv)로 둡니다.
  9. yv ≥ 0이면 yearSign을 빈 String으로 둡니다. 그렇지 않으면 yearSign을 "-"로 둡니다.
  10. paddedYear를 ToZeroPaddedDecimalString(abs(yv), 4)로 둡니다.
  11. weekday, ",", 코드 단위 0x0020 (SPACE), day, 코드 단위 0x0020 (SPACE), month, 코드 단위 0x0020 (SPACE), yearSign, paddedYear, 코드 단위 0x0020 (SPACE) 및 TimeString(tv)의 문자열 연결을 반환합니다.

21.4.4.44 Date.prototype.valueOf ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. dateObj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(dateObj, [[DateValue]])를 수행합니다.
  3. dateObj.[[DateValue]]를 반환합니다.

21.4.4.45 Date.prototype [ %Symbol.toPrimitive% ] ( hint )

이 메서드는 ECMAScript 언어 연산자가 Date를 원시 값으로 변환하기 위해 호출합니다. hint에 허용되는 값은 "default", "number" 및 "string"입니다. Date는 "default"를 "string"과 동등하게 취급한다는 점에서 내장 ECMAScript 객체 중 유일합니다. 다른 모든 내장 ECMAScript 객체는 "default"를 "number"와 동등하게 취급합니다.

호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 TypeError 예외를 던집니다.
  3. hint가 "string" 또는 "default" 중 하나이면, 다음을 수행합니다.
    1. tryFirst를 string으로 둡니다.
  4. 그렇지 않고 hint가 "number"이면, 다음을 수행합니다.
    1. tryFirst를 number로 둡니다.
  5. 그렇지 않으면,
    1. TypeError 예외를 던집니다.
  6. ? OrdinaryToPrimitive(obj, tryFirst)를 반환합니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.toPrimitive]"입니다.

21.4.5 Date 인스턴스의 프로퍼티

Date 인스턴스는 Date 프로토타입 객체에서 프로퍼티를 상속하는 일반 객체입니다. Date 인스턴스에는 [[DateValue]] 내부 슬롯도 있습니다. [[DateValue]] 내부 슬롯은 이 Date가 나타내는 시간 값입니다.