Спецификация ECMAScript 5.1 с аннотациями

Поделиться

15.9 Объекты Date #

15.9.1 Обзор объектов Date и определение абстрактных операторов #

Перечисленные ниже функции являются абстрактными операторами, оперирующими значениями времени (определение которым приводится в пункте 15.9.1.1). Обратите внимание, что, для каждой из этих функций, если какой-либо из её аргументов является NaN, то и результат будет NaN.

15.9.1.1 Значения времени и временной диапазон #

Объект типа Date содержит число, означающее конкретный момент времени с точностью до миллисекунды. Это число называется значением времени time value. Значение времени может быть NaN, и в этом случае объект Date не представляет собой какого-либо конкретного момента времени.

В ECMAScript время измеряется в миллисекундах с 01 января 1970г. по всемирному координированному времени (UTC). Корректировочные секунды, или секунды координации всемирного времени игнорируются. Предполагается, что каждый день содержит ровно 86 400 000 миллисекунд. Числовые значения в языке ECMAScript могут представить все целые числа от –9 007 199 254 740 991 до 9 007 199 254 740 991. Этого диапазона достаточно для измерения с точностью до миллисекунды любого момента времени в пределах приблизительно до 285 616 лет назад или вперёд с даты 01 января 1970г. по UTC.

Фактический диапазон времени, поддерживаемый объектами Date в языке ECMAScript, немного меньше: ровно от –100 000 000 до 100 000 000 дней, измеряемых относительно полуночи, с которой начинается 01 января 1970г. по UTC. Это равно 8 640 000 000 000 000 миллисекундам в обоих направлениях от 01 января 1970г. по UTC.

Точный момент полуночи, с которого начинается 01 января 1970г. по UTC, представлен значением +0.

15.9.1.2 Номер дня и время дня #

Заданное значение времени t означает номер дня

Day(t) = floor(t / msPerDay),

где количество миллисекунд в день равно

msPerDay = 86400000

Остаток называется временем дня:

TimeWithinDay(t) = t modulo msPerDay

15.9.1.3 Номер года #

В языке ECMAScript используется экстраполированный григорианский календарь для приведения номера дня к номеру года и определения месяца и даты в этом году. В соответствии с этим календарём, високосный год – это год, который (кратен 4) и ((не кратен 100) или (кратен 400)). Таким образом, количество дней в году y определяется следующим представлением:

DaysInYear(y) = 365 если (y modulo 4) 0
= 366 если (y modulo 4) = 0 и (y modulo 100) 0
= 365 если (y modulo 100) = 0 и (y modulo 400) 0
= 366 если (y modulo 400) = 0

Все невисокосные годы имеют 365 дней с обычным количеством дней в месяц, а високосные годы имеют дополнительный день в феврале. Номер дня первого дня года y получается следующим образом:

DayFromYear(y) = 365 × (y1970) + floor((y1969)/4) floor((y1901)/100) + floor((y1601)/400)

Значение времени на начало года получается следующим образом:

TimeFromYear(y) = msPerDay × DayFromYear(y)

Значение времени определяет год следующим образом:

YearFromTime(t) = такое наибольшее целое число y (ближайшее к положительной бесконечности), чтобы TimeFromYear(y) t

Если время имеет место в течение високосного года, то функция високосного года производит 1, в противном случае – ноль:

InLeapYear(t) = 0 если DaysInYear(YearFromTime(t)) = 365
= 1 если DaysInYear(YearFromTime(t)) = 366

15.9.1.4 Номер месяца #

Для обозначения месяцев используется целое число от 0 до 11 включительно. MonthFromTime(t) – преобразование значения времени t в номер месяца – производится следующим образом:

MonthFromTime(t) = 0 если 0 DayWithinYear(t) < 31
= 1 если 31 DayWithinYear (t) < 59+InLeapYear(t)
= 2 если 59+InLeapYear(t) DayWithinYear (t) < 90+InLeapYear(t)
= 3 если 90+InLeapYear(t) DayWithinYear (t) < 120+InLeapYear(t)
= 4 если 120+InLeapYear(t) DayWithinYear (t) < 151+InLeapYear(t)
= 5 если 151+InLeapYear(t) DayWithinYear (t) < 181+InLeapYear(t)
= 6 если 181+InLeapYear(t) DayWithinYear (t) < 212+InLeapYear(t)
= 7 если 212+InLeapYear(t) DayWithinYear (t) < 243+InLeapYear(t)
= 8 если 243+InLeapYear(t) DayWithinYear (t) < 273+InLeapYear(t)
= 9 если 273+InLeapYear(t) DayWithinYear (t) < 304+InLeapYear(t)
= 10 если 304+InLeapYear(t) DayWithinYear (t) < 334+InLeapYear(t)
= 11 если 334+InLeapYear(t) DayWithinYear (t) < 365+InLeapYear(t)

где

DayWithinYear(t) = Day(t)DayFromYear(YearFromTime(t))

Значение месяца 0 означает январь; 1 означает февраль; 2 – март; 3 – апрель; 4 – май; 5 – июнь; 6 – июль; 7 – август; 8 – сентябрь; 9 – октябрь; 10 – ноябрь; 11 – декабрь. Обратите внимание, что MonthFromTime(0) = 0, что соответствует вторнику, 01 января, 1970г.

15.9.1.5 Номер даты #

Для обозначения даты используется целое число от 1 до 31 включительно. DateFromTime(t) – преобразование значения времени t в номер месяца – производится следующим образом:

DateFromTime(t) = DayWithinYear(t)+1 если MonthFromTime(t)=0
= DayWithinYear(t)30 если MonthFromTime(t)=1
= DayWithinYear(t)58InLeapYear(t) если MonthFromTime(t)=2
= DayWithinYear(t)89InLeapYear(t) если MonthFromTime(t)=3
= DayWithinYear(t)119InLeapYear(t) если MonthFromTime(t)=4
= DayWithinYear(t)150InLeapYear(t) если MonthFromTime(t)=5
= DayWithinYear(t)180InLeapYear(t) если MonthFromTime(t)=6
= DayWithinYear(t)211InLeapYear(t) если MonthFromTime(t)=7
= DayWithinYear(t)242InLeapYear(t) еслиMonthFromTime(t)=8
= DayWithinYear(t)272InLeapYear(t) если MonthFromTime(t)=9
= DayWithinYear(t)303InLeapYear(t) если MonthFromTime(t)=10
= DayWithinYear(t)333InLeapYear(t) если MonthFromTime(t)=11

15.9.1.6 День недели #

День недели для конкретного значения времени t определяется следующим образом:

WeekDay(t) = (Day(t) + 4) modulo 7

Значение дня недели 0 означает воскресенье; 1 – понедельник; 2 – вторник; 3 – среду; 4 – четверг; 5 – пятницу; 6 – субботу. Обратите внимание, что WeekDay(0) = 4, что соответствует вторнику, 01 января, 1970г.

15.9.1.7 Поправка на местное время #

Реализация ECMAScript должна определять поправку на местное время. Поправка на местное время представляет собой значение LocalTZA, измеряемое в миллисекундах, которые при добавлении к времени UTC представляют стандартное местное время. Значение LocalTZA не отражает переход на летнее время. Значение LocalTZA не изменяется со временем, а зависит исключительно от географического местоположения.

15.9.1.8 Поправка на летнее время #

Реализация ECMAScript должна определять алгоритм перехода на летнее время. Алгоритм для определения поправки на летнее время DaylightSavingTA(t), измеряемый в миллисекундах, должен зависеть только от четырёх моментов:

(1) времени с начала года

tTimeFromYear(YearFromTime(t))

(2) приходится ли время t на високосный год

InLeapYear(t)

(3) дня недели, на который выпадает начало года

WeekDay(TimeFromYear(YearFromTime(t))

и (4) географического местоположения.

Реализация ECMAScript не должна пытаться определить, подвергалось ли фактическое время переходу на летнее время. Она должна только определять, действовало бы летнее время, если бы в тот момент применить текущий алгоритм определения поправки на летнее время. Это позволит избежать таких осложнений, как учёт лет, когда в конкретной местности летнее время использовалось круглый год.

Если внешняя среда обеспечивает функциональные возможности для определения летнего времени, то реализация на ECMAScript может сопоставить заданный год с эквивалентным годом (аналогичной високосности и с таким же днём недели, выпадающим на начало года), для которого внешняя среда предоставляет информацию о летнем времени. Единственное ограничение заключается в том, что все эквивалентные годы должны производить один и тот же результат.

15.9.1.9 Местное время #

Преобразование из времени по UTC в местное время определяется следующим образом:

LocalTime(t) = t + LocalTZA + DaylightSavingTA(t)

Преобразование из местного времени в формат времени по UTC определяется следующим образом:

UTC(t) = tLocalTZA – DaylightSavingTA(tLocalTZA)

Обратите внимание, что UTC(LocalTime(t)) не обязательно всегда равно t.

15.9.1.10 Часы, минуты, секунды и миллисекунды #

Для разложения значений времени используются следующие функции:

HourFromTime(t) = floor(t / msPerHour) modulo HoursPerDay

MinFromTime(t) = floor(t / msPerMinute) modulo MinutesPerHour

SecFromTime(t) = floor(t / msPerSecond) modulo SecondsPerMinute

msFromTime(t) = t modulo msPerSecond

где

HoursPerDay часов в дне = 24

MinutesPerHour минут в часе = 60

SecondsPerMinute секунд в минуту = 60

msPerSecond миллисекунд в секунду = 1000

msPerMinute миллисекунд в минуту = 60000 = msPerSecond × SecondsPerMinute

msPerHour миллисекунд в час = 3600000 = msPerMinute × MinutesPerHour

15.9.1.11 MakeTime (hour, min, sec, ms) #

Оператор MakeTime вычисляет количество миллисекунд, используя значения своих четырёх аргументов, которые должны быть числовыми значениями ECMAScript. Он действует следующим образом:

  1. Если hour не является конечным числом или min не является конечным числом, или sec не является конечным числом, или ms не является конечным числом, вернуть NaN.

  2. Пусть h будет ToInteger(hour).

  3. Пусть m будет ToInteger(min).

  4. Пусть s будет ToInteger(sec).

  5. Пусть milli будет ToInteger(ms).

  6. Пусть t будет h * msPerHour + m * msPerMinute + s * msPerSecond + milli, при этом арифметические действия выполняются в соответствии с правилами стандарта IEEE 754 (то есть, как если бы с использованием операторов ECMAScript * и +).

  7. Вернуть t.

15.9.1.12 MakeDay (year, month, date) #

Оператор MakeDay вычисляет количество дней, используя значения своих трёх аргументов, которые должны быть числовыми значениями ECMAScript. Он действует следующим образом:

  1. Если year не является конечным числом или month не является конечным числом, или date не является конечным числом, вернуть NaN.

  2. Пусть y будет ToInteger(year).

  3. Пусть m будет ToInteger(month).

  4. Пусть dt будет ToInteger(date).

  5. Пусть ym будет y + floor(m /12).

  6. Пусть mn будет m modulo 12.

  7. Найти такое значение t, чтобы YearFromTime(t) == ym и MonthFromTime(t) == mn) и DateFromTime(t) == 1; но если это невозможно (из-за того, что один из аргументов находится вне допустимого диапазона), вернуть NaN.

  8. Вернуть Day(t) + dt 1.

15.9.1.13 MakeDate (day, time) #

Оператор MakeDate вычисляет количество миллисекунд, используя значения своих двух аргументов, которые должны быть числовыми значениями ECMAScript. Он действует следующим образом:

  1. Если day не является конечным числом или time не является конечным числом, вернуть NaN.

  2. Вернуть day × msPerDay + time.

15.9.1.14 TimeClip (time) #

Оператор TimeClip вычисляет количество миллисекунд, используя значение своего аргумента, которое должно быть числовым значением ECMAScript. Он действует следующим образом:

  1. Если time не является конечным числом, вернуть NaN.

  2. Если abs(time) > 8.64 x 1015, вернуть NaN.

  3. Вернуть либо ToInteger(time), либо ToInteger(time) + (+0), выбор которых зависит от реализации. (При добавлении положительного нуля 0 преобразуется в +0).

ПРИМЕЧАНИЕ Смысл шага 3 заключается в том, что реализации разрешается выбирать из внутренних представлений значений времени, например – представление в виде знакового 64-битового целого, или в виде 64-битового значения с плавающей точкой. В зависимости от реализации, это внутреннее представление может различать между 0 и +0, или нет.

15.9.1.15 Строковый формат "дата и время" #

ECMAScript определяет строковый формат замены для даты-времени на основании упрощения Расширенного формата ISO 8601. Этот формат выглядит следующим образом: YYYY-MM-DDTHH:mm:ss.sssZ

где поля имеют следующие значения:

YYYYдесятичные цифры, обозначающие год по григорианскому календарю.
-буквальное изображение “-” (дефис) встречается в строке дважды.
MMмесяц года с 01 (январь) по 12 (декабрь).
DDдень месяца с 01 по 31.
Tбуквальное изображение “T” встречается в строке, чтобы обозначить начало элемента, указывающего время.
HHколичество полных часов, прошедших с полуночи, представленных в виде двух десятичных цифр.
:буквальное изображение “:” (двоеточие) встречается в строке дважды.
mmколичество полных минут, прошедших с начала часа, представленных в виде двух десятичных цифр.
ssколичество полных секунд, прошедших с начала минуты, представленных в виде двух десятичных цифр.
.буквальное изображение “.” (точка) встречается в строке.
sssколичество полных миллисекунд, прошедших с начала секунды, представленных в виде трёх десятичных цифр.
Zсмещение на часовой пояс, указанное в виде “Z” (для UTC), либо в виде знака “+” или “-”, после которого следует выражение hh:mm

Этот формат включает в себя следующие формы представления "только дата":

YYYY
YYYY-MM
YYYY-MM-DD

Он также включает в себя формы "дата и время", состоящие из одной из вышеуказанных форм типа "только дата", за которой сразу же следует “T”, а затем одна из нижеследующих форм представления времени, а за ней – необязательное значение смещения на часовой пояс:

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

Все числа должны иметь основание 10. Если поле MM или DD отсутствует, в качестве значений используется “01”. Если поле mm или ss отсутствует, в качестве значений используется “00”, а если отсутствует поле sss, в качестве его значения используется “000”. Значение отсутствующего смещения на часовой пояс равно “Z”.

Если в строке данного формата встречаются некорректные значения (то есть, выходящие за предписанные рамки, или содержащие синтаксические ошибки), это значит, что эта строка не является действительным экземпляром данного формата.

ПРИМЕЧАНИЕ 1 Поскольку и начало и конец каждого дня приходятся на полночь, существует два варианта записи – 00:00 и 24:00, позволяющие различить две полуночи, относящиеся к одной и той же дате. Это значит, что две записи: 1995-02-04T24:00 и 1995-02-05T00:00 – обозначают совершенно одинаковый момент времени.

ПРИМЕЧАНИЕ 2 Нет международных стандартов, которые бы задавали аббревиатуры для гражданских часовых поясов, таких как CET (центральноевропейское время), EST (стандартное восточное время), и т.д., и даже иногда одна и та же аббревиатура используется для обозначения двух совершенно разных часовых поясов. Поэтому стандарт ISO 8601 и данный формат используют числовое представление даты и времени.

15.9.1.15.1 Увеличенное количество лет #

В языке ECMAScript необходимо иметь возможность указать 6-значное количество лет (увеличенное количество лет) – приблизительно на 285 616 лет вперёд или назад с даты 01 января 1970г. по UTC. Для представления лет до 0 года или после 9999 года стандарт ISO 8601 позволяет расширить формат представления лет, но только после предварительной договорённости между отправителем и получателем. В упрощённом формате ECMAScript такое представление получит 2 дополнительные цифры для обозначения года, и перед обозначением года обязательно будет присутствовать знак "+" или "–". Нулевой год ("0") считается положительным, поэтому перед ним используется знак "+".

15.9.2 Вызов конструктора Date как функции #

При вызове Date не в качестве конструктора, а в качестве функции, возвращается строка, представляющая собой текущее время (UTC).

ПРИМЕЧАНИЕ Вызов функции Date() не эквивалентен выражению для создания объекта new Date() с теми же аргументами.

15.9.2.1 Date ( [ year [, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] ] ] ) #

Все аргументы являются необязательными. Все передаваемые аргументы принимаются, но полностью игнорируются. Создаётся и возвращается строка, как если бы она была создана выражением (new Date()).toString(), где Date является стандартным встроенным конструктором с этим именем, а toString является стандартным встроенным методом Date.prototype.toString.

15.9.3 Конструктор Date #

Если Date вызывается как часть выражения new, он является конструктором, так как он инициализирует создаваемый объект.

15.9.3.1 new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] ) #

При вызове конструктора Date с аргументами в количестве от двух до семи вычисляется дата, состоящая из year, month, и (необязательно) date, hours, minutes, seconds и ms.

Внутреннее свойство [[Prototype]] создаваемого объекта устанавливается равным исходному объекту-прототипу Date, который представляет собой начальное значение свойства Date.prototype (15.9.4.1).

Внутреннее свойство [[Class]] создаваемого объекта устанавливается равным "Date".

Внутреннее свойство [[Extensible]] создаваемого объекта устанавливается равным true.

Внутреннее свойство [[PrimitiveValue]] создаваемого объекта устанавливается следующим образом:

  1. Пусть y будет ToNumber(year).

  2. Пусть m будет ToNumber(month).

  3. Если date передаётся, пусть dt будет ToNumber(date); иначе пусть dt будет 1.

  4. Если hours передаётся, пусть h будет ToNumber(hours); иначе пусть h будет 0.

  5. Если minutes передаётся, пусть min будет ToNumber(minutes); иначе пусть min будет 0.

  6. Если seconds передаётся, пусть s будет ToNumber(seconds); иначе пусть s будет 0.

  7. Если ms передаётся, пусть milli будет ToNumber(ms); иначе пусть milli будет 0.

  8. Если y не равно NaN, и 0  ToInteger(y 99, то пусть yr будет 1900+ToInteger(y); иначе пусть yr будет y.

  9. Пусть finalDate будет MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli)).

  10. Установить внутреннее свойство [[PrimitiveValue]] создаваемого объекта равным TimeClip(UTC(finalDate)).

15.9.3.2 new Date (value) #

Внутреннее свойство [[Prototype]] создаваемого объекта устанавливается равным исходному объекту-прототипу Date, который представляет собой начальное значение свойства Date.prototype (15.9.4.1).

Внутреннее свойство [[Class]] создаваемого объекта устанавливается равным "Date".

Внутреннее свойство [[Extensible]] создаваемого объекта устанавливается равным true.

Внутреннее свойство [[PrimitiveValue]] создаваемого объекта устанавливается следующим образом:

  1. Пусть v будет ToPrimitive(value).

  2. Если Type(v) равно String, то

    1. Сделать разбор v как даты, точно таким же образом, как для метода parse (15.9.4.2); пусть V будет значением времени для этой даты.

  3. Иначе, пусть V будет ToNumber(v).

  4. Установить внутреннее свойство [[PrimitiveValue]] создаваемого объекта равным TimeClip(V) и вернуть.

15.9.3.3 new Date ( ) #

Внутреннее свойство [[Prototype]] создаваемого объекта устанавливается равным исходному объекту-прототипу Date, который представляет собой начальное значение свойства Date.prototype (15.9.4.1).

Внутреннее свойство [[Class]] создаваемого объекта устанавливается равным "Date".

Внутреннее свойство [[Extensible]] создаваемого объекта устанавливается равным true.

Внутреннее свойство [[PrimitiveValue]] создаваемого объекта устанавливается равным значению времени (UTC), обозначающему текущее время.

15.9.4 Свойства конструктора Date #

Значением внутреннего свойства [[Prototype]] конструктора Date является объект-прототип Function (15.3.4).

Кроме внутренних свойств и свойства length со значением 7, конструктор Date имеет следующие свойства:

15.9.4.1 Date.prototype #

Начальным значением Date.prototype является встроенный объект-прототип Date (15.9.5).

Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }

15.9.4.2 Date.parse (string) #

Функция parse применяет к своему аргументу оператор ToString и интерпретирует полученную строку как дату и время. Эта функция возвращает число – значение времени по UTC, соответствующее этой дате и времени. Строка может быть интерпретирована как местное время, как время по UTC, или как время в любом другом часовом поясе, в зависимости от содержимого строки. Сначала функция пытается разобрать формат строки в соответствии с правилами Строкового формата "дата и время" Date Time String Format, см. пункт 15.9.1.15. Если строка не соответствует этому формату, функция может применить эвристические правила более низкого уровня или формат даты более низкого уровня, обусловленные реализацией. Если строка не распознаётся, или если дата содержит некорректные значения в формате String, функция Date.parse вернёт NaN.

Если x является объектом типа Date с количеством миллисекунд, равным нулю в конкретной реализации ECMAScript, то все нежеперечисленные выражения должны в этой реализации возвращать одинаковые числовые значения, если все упоминаемые свойства имеют первоначальные значения:

x.valueOf()

Date.parse(x.toString())

Date.parse(x.toUTCString())

Date.parse(x.toISOString())

Однако, выражение

Date.parse( x.toLocaleString())

не обязано возвращать такое же числовое значение, что и три предыдущие выражения, и, в целом, значение, возвращаемое функцией Date.parse зависит от реализации, если функции передаётся строковое значение, не соответствующее Строковому формату "дата-время" (15.9.1.15), которое в этой реализации не может быть результатом метода toString или toUTCString .

15.9.4.3 Date.UTC (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] ) #

При вызове функции UTC менее чем с двумя аргументами ее поведение зависит от реализации. При вызове функции UTC с аргументами в количестве от двух до семи вычисляется дата, состоящая из year, month, и (необязательно) date, hours, minutes, seconds и ms. Выполняются следующие шаги:

  1. Пусть y будет ToNumber(year).

  2. Пусть m будет ToNumber(month).

  3. Если date передаётся, пусть dt будет ToNumber(date); иначе пусть dt будет 1.

  4. Если hours передаётся, пусть h будет ToNumber(hours); иначе пусть h будет 0.

  5. Если minutes передаётся, пусть min будет ToNumber(minutes); иначе пусть min будет 0.

  6. Если seconds передаётся, пусть s будет ToNumber(seconds); иначе пусть s будет 0.

  7. Если ms передаётся, пусть milli будет ToNumber(ms); иначе пусть milli будет 0.

  8. Если y не равно NaN, и 0  ToInteger(y 99, то пусть yr будет 1900+ToInteger(y); иначе пусть yr будет y.

  9. Вернуть TimeClip(MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))).

Свойство length для UTC равно 7.

ПРИМЕЧАНИЕ Функция UTC отличается от конструктора Date двумя моментами: она возвращает значение времени как число, а не создаёт объект Date, и она интерпретирует аргументы по UTC, а не по местному времени.

15.9.4.4 Date.now ( ) #

Функция now возвращает числовое значение, которое представляет собой значение времени, означающее дату и время вызова функции now по UTC.

15.9.5 Свойства объекта-прототипа Date #

Объект-прототип Date представляет собой объект типа Date (его [[Class]] равен "Date"), у которого [[PrimitiveValue]] равно NaN.

Значением внутреннего свойства [[Prototype]] объекта-прототипа Date является стандартный встроенный объект-прототип Object (15.2.4).

В приведённых ниже описаниях функций, которые являются свойствами объекта-прототипа Date, фраза "объект this типа Date" означает объект, который представляет собой значение this, переданное при вызове функции. Если только явно не указано иначе, ни одна из этих функций не является родовой функцией: если значение this не является объектом, для которого значение внутреннего свойства [[Class]] равно "Date", генерируется исключение TypeError. Кроме того, фраза “значение времени this” означает числовое значение времени, представленное объектом this типа Date, то есть, значение внутреннего свойства [[PrimitiveValue]] объекта this типа Date.

15.9.5.1 Date.prototype.constructor #

Начальным значением Date.prototype.constructor является встроенный конструктор Date.

15.9.5.2 Date.prototype.toString ( ) #

Эта функция возвращает строковое значение. Содержимое этой строки зависит от реализации, но оно должно представлять полную дату в соответствии с текущим часовым поясом, и в формате, удобном для восприятия человеком.

ПРИМЕЧАНИЕ Для всех значений Date d, у которых количество миллисекунд равно нулю, результат Date.parse(d.toString()) равен результату d.valueOf(). См. 15.9.4.2.

15.9.5.3 Date.prototype.toDateString ( ) #

Эта функция возвращает строковое значение. Содержимое этой строки зависит от реализации, но оно должно представлять часть, обозначающую дату, в соответствии с текущим часовым поясом, и в формате, удобном для восприятия человеком.

15.9.5.4 Date.prototype.toTimeString ( ) #

Эта функция возвращает строковое значение. Содержимое этой строки зависит от реализации, но оно должно представлять часть, обозначающую время, в соответствии с текущим часовым поясом, и в формате, удобном для восприятия человеком.

15.9.5.5 Date.prototype.toLocaleString ( ) #

Эта функция возвращает строковое значение. Содержимое этой строки зависит от реализации, но оно должно представлять полную дату в соответствии с текущим часовым поясом, в формате, удобном для восприятия человеком, и с соблюдением требований текущей языковой настройки внешней среды.

ПРИМЕЧАНИЕ Первый параметр этой функции наверняка будет использоваться в будущей версии данного стандарта. Реализациям не рекомендуется использовать этот параметр для других целей.

15.9.5.6 Date.prototype.toLocaleDateString ( ) #

Эта функция возвращает строковое значение. Содержимое этой строки зависит от реализации, но оно должно представлять часть, обозначающую дату, в соответствии с текущим часовым поясом, и в формате, удобном для восприятия человеком, и с соблюдением требований текущей языковой настройки внешней среды.

ПРИМЕЧАНИЕ Первый параметр этой функции наверняка будет использоваться в будущей версии данного стандарта. Реализациям не рекомендуется использовать этот параметр для других целей.

15.9.5.7 Date.prototype.toLocaleTimeString ( ) #

Эта функция возвращает строковое значение. Содержимое этой строки зависит от реализации, но оно должно представлять часть, обозначающую время, в соответствии с текущим часовым поясом, в формате, удобном для восприятия человеком, и с соблюдением требований текущей языковой настройки внешней среды.

ПРИМЕЧАНИЕ Первый параметр этой функции наверняка будет использоваться в будущей версии данного стандарта. Реализациям не рекомендуется использовать этот параметр для других целей.

15.9.5.8 Date.prototype.valueOf ( ) #

Функция valueOf возвращает число, которое является значением времени this.

15.9.5.9 Date.prototype.getTime ( ) #
  1. Возвращает значение времени this.

15.9.5.10 Date.prototype.getFullYear ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть YearFromTime(LocalTime(t)).

15.9.5.11 Date.prototype.getUTCFullYear ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть YearFromTime(t).

15.9.5.11 Date.prototype.getUTCFullYear ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть MonthFromTime(LocalTime(t)).

15.9.5.13 Date.prototype.getUTCMonth ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть MonthFromTime(t).

15.9.5.14 Date.prototype.getDate ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть DateFromTime(LocalTime(t)).

15.9.5.15 Date.prototype.getUTCDate ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть DateFromTime(t).

15.9.5.16 Date.prototype.getDay ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть WeekDay(LocalTime(t)).

15.9.5.17 Date.prototype.getUTCDay ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть WeekDay(t).

15.9.5.18 Date.prototype.getHours ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть HourFromTime(LocalTime(t)).

15.9.5.19 Date.prototype.getUTCHours ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть HourFromTime(t).

15.9.5.20 Date.prototype.getMinutes ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть MinFromTime(LocalTime(t)).

15.9.5.21 Date.prototype.getUTCMinutes ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть MinFromTime(t).

15.9.5.22 Date.prototype.getSeconds ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть SecFromTime(LocalTime(t)).

15.9.5.23 Date.prototype.getUTCSeconds ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть SecFromTime(t).

15.9.5.24 Date.prototype.getMilliseconds ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть msFromTime(LocalTime(t)).

15.9.5.25 Date.prototype.getUTCMilliseconds ( ) #
  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть msFromTime(t).

15.9.5.26 Date.prototype.getTimezoneOffset ( ) #

Возвращает разницу в минутах между местным временем и временем по UTC.

  1. Пусть t будет числовым значением this.

  2. Если t равно NaN, вернуть NaN.

  3. Вернуть (t LocalTime(t)) / msPerMinute.

15.9.5.27 Date.prototype.setTime (time) #
  1. Пусть v будет TimeClip(ToNumber(time)).

  2. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение v.

  3. Вернуть v.

15.9.5.28 Date.prototype.setMilliseconds (ms) #
  1. Пусть t будет результатом LocalTime(значение времени this).

  2. Пусть time будет MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ToNumber(ms)).

  3. Пусть u будет TimeClip(UTC(MakeDate(Day(t), time))).

  4. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение u.

  5. Вернуть u.

15.9.5.29 Date.prototype.setUTCMilliseconds (ms) #
  1. Пусть t будет числовым значением this.

  2. Пусть time будет MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ToNumber(ms)).

  3. Пусть v будет TimeClip(MakeDate(Day(t), time)).

  4. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение v.

  5. Вернуть v.

15.9.5.30 Date.prototype.setSeconds (sec [, ms ] ) #

Если ms не задано, this ведёт себя так, как если бы ms было задано значением getMilliseconds().

  1. Пусть t будет результатом LocalTime(значение времени this).

  2. Пусть s будет ToNumber(sec).

  3. Если ms не задано, пусть milli будет msFromTime(t); иначе пусть milli будет ToNumber(ms).

  4. Пусть date будет MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli)).

  5. Пусть u будет TimeClip(UTC(date)).

  6. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение u.

  7. Вернуть u.

Свойство length для метода setSeconds равно 2.

15.9.5.31 Date.prototype.setUTCSeconds (sec [, ms ] ) #

Если ms не задано, this ведёт себя так, как если бы ms было задано значением getUTCMilliseconds().

  1. Пусть t будет числовым значением this.

  2. Пусть s будет ToNumber(sec).

  3. Если ms не задано, пусть milli будет msFromTime(t); иначе пусть milli будет ToNumber(ms).

  4. Пусть date будет MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli)).

  5. Пусть v будет TimeClip(date).

  6. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение v.

  7. Вернуть v.

Свойство length для метода setUTCSeconds равно 2.

15.9.5.32 Date.prototype.setMinutes (min [, sec [, ms ] ] ) #

Если sec не задано, this ведёт себя так, как если бы sec было задано значением getSeconds().

Если ms не задано, this ведёт себя так, как если бы ms было задано значением getMilliseconds().

  1. Пусть t будет результатом LocalTime(значение времени this).

  2. Пусть m будет ToNumber(min).

  3. Если sec не задано, пусть s будет SecFromTime(t); иначе, пусть s будет ToNumber(sec).

  4. Если ms не задано, пусть milli будет msFromTime(t); иначе пусть milli будет ToNumber(ms).

  5. Пусть date будет MakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli)).

  6. Пусть u будет TimeClip(UTC(date)).

  7. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение u.

  8. Вернуть u.

Свойство length для метода setMinutes равно 3.

15.9.5.33 Date.prototype.setUTCMinutes (min [, sec [, ms ] ] ) #

Если sec не задано, this ведёт себя так, как если бы sec было задано значением getUTCSeconds().

Если ms не задано, эта функция ведёт себя так, как если бы ms было задано значением, полученным посредством  getUTCMilliseconds().

  1. Пусть t будет числовым значением this.

  2. Пусть m будет ToNumber(min).

  3. Если sec не задано, пусть s будет SecFromTime(t); иначе, пусть s будет ToNumber(sec).

  4. Если ms не задано, пусть milli будет msFromTime(t); иначе пусть milli будет ToNumber(ms).

  5. Пусть date будет MakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli)).

  6. Пусть v будет TimeClip(date).

  7. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение v.

  8. Вернуть v.

Свойство length для метода setUTCMinutes равно 3.

15.9.5.34 Date.prototype.setHours (hour [, min [, sec [, ms ] ] ] ) #

Если min не задано, this ведёт себя так, как если бы min было задано значением getMinutes().

Если sec не задано, this ведёт себя так, как если бы sec было задано значением getSeconds().

Если ms не задано, this ведёт себя так, как если бы ms было задано значением getMilliseconds().

  1. Пусть t будет результатом LocalTime(значение времени this).

  2. Пусть h будет ToNumber(hour).

  3. Если min не задано, пусть m будет MinFromTime(t); иначе пусть m будет ToNumber(min).

  4. Если sec не задано, пусть s будет SecFromTime(t); иначе, пусть s будет ToNumber(sec).

  5. Если ms не задано, пусть milli будет msFromTime(t); иначе пусть milli будет ToNumber(ms).

  6. Пусть date будет MakeDate(Day(t), MakeTime(h, m, s, milli)).

  7. Пусть u будет TimeClip(UTC(date)).

  8. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение u.

  9. Вернуть u.

Свойство length для метода setHours равно 4.

15.9.5.35 Date.prototype.setUTCHours (hour [, min [, sec [, ms ] ] ] ) #

Если min не задано, this ведёт себя так, как если бы min было задано значением getUTCMinutes().

Если sec не задано, this ведёт себя так, как если бы sec было задано значением getUTCSeconds().

Если ms не задано, this ведёт себя так, как если бы ms было задано значением getUTCMilliseconds().

  1. Пусть t будет числовым значением this.

  2. Пусть h будет ToNumber(hour).

  3. Если min не задано, пусть m будет MinFromTime(t); иначе пусть m будет ToNumber(min).

  4. Если sec не задано, пусть s будет SecFromTime(t); иначе, пусть s будет ToNumber(sec).

  5. Если ms не задано, пусть milli будет msFromTime(t); иначе пусть milli будет ToNumber(ms).

  6. Пусть newDate будет MakeDate(Day(t), MakeTime(h, m, s, milli)).

  7. Пусть v будет TimeClip(newDate).

  8. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение v.

  9. Вернуть v.

Свойство length для метода setUTCHours равно 4.

15.9.5.36 Date.prototype.setDate (date) #
  1. Пусть t будет результатом LocalTime(значение времени this).

  2. Пусть dt будет ToNumber(date).

  3. Пусть newDate будет MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t)).

  4. Пусть u будет TimeClip(UTC(newDate)).

  5. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение u.

  6. Вернуть u.

15.9.5.37 Date.prototype.setUTCDate (date) #
  1. Пусть t будет числовым значением this.

  2. Пусть dt будет ToNumber(date).

  3. Пусть newDate будет MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t)).

  4. Пусть v будет TimeClip(newDate).

  5. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение v.

  6. Вернуть v.

15.9.5.38 Date.prototype.setMonth (month [, date ] ) #

Если date не задано, this ведёт себя так, как если бы date было задано значением getDate().

  1. Пусть t будет результатом LocalTime(значение времени this).

  2. Пусть m будет ToNumber(month).

  3. Если date не задано, пусть dt будет DateFromTime(t); в противном случае, пусть dt будет ToNumber(date).

  4. Пусть newDate будет MakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t)).

  5. Пусть u будет TimeClip(UTC(newDate)).

  6. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение u.

  7. Вернуть u.

Свойство length для метода setMonth равно 2.

15.9.5.39 Date.prototype.setUTCMonth (month [, date ] ) #

Если date не задано, this ведёт себя так, как если бы date было задано значением getUTCDate().

  1. Пусть t будет числовым значением this.

  2. Пусть m будет ToNumber(month).

  3. Если date не задано, пусть dt будет DateFromTime(t); в противном случае, пусть dt будет ToNumber(date).

  4. Пусть newDate будет MakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t)).

  5. Пусть v будет TimeClip(newDate).

  6. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение v.

  7. Вернуть v.

Свойство length для метода setUTCMonth равно 2.

15.9.5.40 Date.prototype.setFullYear (year [, month [, date ] ] ) #

Если month не задано, this ведёт себя так, как если бы month было задано значением getMonth().

Если date не задано, this ведёт себя так, как если бы date было задано значением getDate().

  1. Пусть t будет результатом LocalTime(значение времени this ); но если значение времени this равно NaN, пусть t будет +0.

  2. Пусть y будет ToNumber(year).

  3. Если month не задано, пусть m будет MonthFromTime(t); иначе пусть m будет ToNumber(month).

  4. Если date не задано, пусть dt будет DateFromTime(t); в противном случае, пусть dt будет ToNumber(date).

  5. Пусть newDate будет MakeDate(MakeDay(y, m, dt), TimeWithinDay(t)).

  6. Пусть u будет TimeClip(UTC(newDate)).

  7. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение u.

  8. Вернуть u.

Свойство length для метода setFullYear равно 3.

15.9.5.41 Date.prototype.setUTCFullYear (year [, month [, date ] ] ) #

Если month не задано, this ведёт себя так, как если бы month было задано значением getUTCMonth().

Если date не задано, this ведёт себя так, как если бы date было задано значением getUTCDate().

  1. Пусть t будет значением времени this ; но если значение времени this равно NaN, пусть t будет +0.

  2. Пусть y будет ToNumber(year).

  3. Если month не задано, пусть m будет MonthFromTime(t); иначе пусть m будет ToNumber(month).

  4. Если date не задано, пусть dt будет DateFromTime(t); в противном случае, пусть dt будет ToNumber(date).

  5. Пусть newDate будет MakeDate(MakeDay(y, m, dt), TimeWithinDay(t)).

  6. Пусть v будет TimeClip(newDate).

  7. Присвоить внутреннему свойству [[PrimitiveValue]] для объекта this типа Date значение v.

  8. Вернуть v.

Свойство length для метода setUTCFullYear равно 3.

15.9.5.42 Date.prototype.toUTCString ( ) #

Эта функция возвращает строковое значение. Содержимое этой строки зависит от реализации, но оно должно представлять полную дату по UTC в формате, удобном для восприятия человеком.

ПРИМЕЧАНИЕ Смысл заключается в том, чтобы получить строковое представление даты, более удобочитаемое, чем формат, указанный в пункте 15.9.1.15. Выбранный формат не обязательно должен быть недвусмысленным или легко подвергаться машинному разбору. Если реализация не предоставляет предпочтительного формата, удобного для восприятия человеком, рекомендуется использовать формат, указанный в пункте 15.9.1.15, но вместо символа “T” для разделения элементов даты и времени следует использовать пробел.

15.9.5.43 Date.prototype.toISOString ( ) #

Эта функция возвращает строковое значение, обозначающее момент времени, представленный объектом this типа Date. Строка возвращается в Строковом формате "дата-время", указанном в пункте 15.9.1.15. В строке присутствуют все поля. Часовым поясом всегда является UTC, о чём свидетельствует суффикс Z. Если значение времени этого объекта не является конечным числом, генерируется исключение RangeError.

15.9.5.44 Date.prototype.toJSON ( key ) #

Эта функция обеспечивает строковое представление объекта Date для использования функцией JSON.stringify (15.12.3).

При вызове метода toJSON с аргументом key выполняются следующие шаги:

  1. Пусть O будет результатом вызова ToObject, с передачей значения this в качестве аргумента.

  2. Пусть tv будет ToPrimitive(O, hint Number).

  3. Если tv является числом и не является конечным числом, вернуть null.

  4. Пусть toISO будет результатом вызова внутреннего метода [[Get]] для O с аргументом "toISOString".

  5. Если IsCallable(toISO) – false, сгенерировать исключение TypeError.

  6. Вернуть результат вызова внутреннего метода [[Call]] для toISO, с O в качестве значения this и с пустым списком аргументов.

ПРИМЕЧАНИЕ 1 Аргумент игнорируется.

ПРИМЕЧАНИЕ 2 Функция toJSON специально является родовой функцией. Она не требует, чтобы её значение this было объектом типа Date. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Однако она требует, чтобы все эти объекты имели метод toISOString. Объект может использовать аргумент key в качестве фильтра.

15.9.6 Свойства экземпляров Date #

Экземпляры Date наследуют свойства объекта-прототипа Date. Значение их внутреннего свойства [[Class]] равно "Date". Кроме того, экземпляры Date имеют внутреннее свойство [[PrimitiveValue]].

Внутреннее свойство [[PrimitiveValue]] является значением времени, представленным объектом this типа Date.