Встроенные объекты
Содержание:
- Класс GregorianCalendar
- Объект Date. Работа с датами
- База данных часовых поясов IANA
- Introduction
- Displaying Dates
- Implementation
- Преобразование даты в строку и её форматирование
- Другие примеры
- JavaScript и База данных часовых поясов IANA
- Summary
- Задание определенной даты
- Автоисправление даты
- JS сравнение дат
- Методы объекта FormData
- GMT, UTC и Offset
Класс GregorianCalendar
КлассGregorianCalendar – конкретная реализация класса Calendar, отображающий обыкновенный григорианский календарь.
Метод getInstance() Calendar возвращает GregorianCalendar, который по умолчанию инициализирован текущей датой и временем, локализацией и часовым поясом. GregorianCalendar определяет 2 поля: н. э и до н. э. Это две эпохи, определяющиеся по григорианскому календарю.
Конструкторы для объектов GregorianCalendar:
Название конструктора | Краткое описание |
GregorianCalendar() | Создает GregorianCalendar, используя текущей датой и временем, локализацией и часовым поясом по умолчанию. |
GregorianCalendar(int year, int month, int date) | Создает значение GregorianCalendar с учетом заданной даты в часовом поясе и локализацией по умолчанию. |
GregorianCalendar(int year, int month, int date, int hour, int minute) | Конструирует GregorianCalendar в соответствии с заданной датой и временем в часовом поясе и локализацией по умолчанию. |
GregorianCalendar(int year, int month, int date, int hour, int minute, int second) | Конструирует GregorianCalendar в соответствии с заданной датой и временем в часовом поясе и локализацией по умолчанию. |
GregorianCalendar(Locale aLocale) | Формирует GregorianCalendar в соответствии с текущим временем в часовом поясе по умолчанию в рамках заданной локализации. |
GregorianCalendar(TimeZone zone) | Создает GregorianCalendar, основанный на текущем времени в данной зоне времени с локализацией по умолчанию. |
GregorianCalendar(TimeZone zone, Locale aLocale) | Формирует GregorianCalendar с учетом текущего времени в указанном часовом поясе и локализации. |
Полезные методы класса GregorianCalendar:
Метод | Описание |
void add(int field, int amount) | Добавляет указанное количество времени в данное временное поле в соответствии с правилами календаря. |
protected void computeFields() | Преобразует время по Гринвичу в миллисекунды до значения полей времени. |
protected void computeTime() | Преобразует значения временного поля Календаря в UTC формате в миллисекундах. |
boolean equals(Object obj) | Сравнивает этот GregorianCalendar эталонным объектом. |
int get(int field) | Получает значение для поля заданного времени. |
int getActualMaximum(int field) | Возвращает максимальное значение, которое это поле может иметь, учитывая текущую дату. |
int getActualMinimum(int field) | Возвращает минимальное значение, которое это поле может иметь, учитывая текущую дату. |
int getGreatestMinimum(int field) | Возвращает наибольшее минимальное значение для данного поля, если изменяется. |
Date getGregorianChange() | Получает изменения даты по григорианскому календарю. |
int getLeastMaximum(int field) | Возвращает минимально максимальное значение для данного поля, если изменяется. |
int getMaximum(int field) | Возвращает максимальное значение для данного поля. |
Date getTime() | Определяет текущее время в соответствии с календарем. |
long getTimeInMillis() | Получает текущее время по Календарю как длительное. |
TimeZone getTimeZone() | Возвращает часовой пояс. |
int getMinimum(int field) | Возвращает минимальное значение для данного поля. |
int hashCode() | Переопределите хэш-код. |
boolean isLeapYear(int year) | Определяет, является ли год високосным. |
void roll(int field, boolean up) | Добавление или вычитание (вверх/вниз) одной единицы времени в данном временном поле без изменений в больших полях. |
void set(int field, int value) | Устанавливает временное поле с заданным значением. |
void set(int year, int month, int date) | Задает значения для поля год, месяц и дата. |
void set(int year, int month, int date, int hour, int minute) | Задает значения для поля год, месяц, дату, час и минуту. |
void set(int year, int month, int date, int hour, int minute, int second) | Задает значения для поля год, месяц, дату, час, минуту и секунду. |
void setGregorianChange(Date date) | Устанавливает дату изменения грегорианского календаря. |
void setTime(Date date) | Устанавливает в соответствии с данным календарем текущее время с заданной датой. |
void setTimeInMillis(long millis) | Устанавливает в соответствии с данным календарем текущее время от заданного long значения. |
void setTimeZone(TimeZone value) | Задает часовой пояс со значением заданного часового пояса. |
String toString() | Возвращает строковое представление календаря. |
Объект Date. Работа с датами
Объект Date позволяет работать с датами и временем в JavaScript.
Существуют различные способы создания объекта Date. Первый способ заключается в использовании пустого конструктора без параметров:
var currentDate = new Date(); document.write(currentDate);
В этом случае объект будет указывать на текущую дату компьютера:
Второй способ заключается в передаче в конструктор Date количества миллисекунд, которые прошли с начала эпохи Unix, то есть с 1 января 1970
года 00:00:00 GMT:
var myDate = new Date(1359270000000); document.write(myDate); // Sun Jan 27 2013 10:00:00 GMT+0300 (RTZ 2 (зима))
Третий способ состоит в передаче в конструктор Date дня, месяца и года:
var myDate = new Date("27 March 2008"); // или так // var myDate = new Date("3/27/2008"); document.write(myDate); // Thu Mar 27 2008 00:00:00 GMT+0300 (RTZ 2 (зима))
Если мы используем полное название месяца, то оно пишется в по-английски, если используем сокращенный вариант, тогда используется формат месяц/день/год.
Четвертый способ состоит в передаче в конструктор Date всех параметров даты и времени:
var myDate = new Date(2012,11,25,18,30,20,10); // Tue Dec 25 2012 18:30:20 GMT+0300 (RTZ 2 (зима))
В данном случае используются по порядку следующие параметры: .
При этом надо учитывать, что отсчет месяцев начинается с нуля, то есть январь — 0, а декабрь — 11.
Получение даты и времени
Для получения различных компонентов даты применяется ряд методов:
-
getDate(): возвращает день месяца
-
getDay(): возвращает день недели (отсчет начинается с 0 — воскресенье, и последний день — 6 — суббота)
-
getMonth(): возвращает номер месяца (отсчет начинается с нуля, то есть месяц с номер 0 — январь)
-
getFullYear(): возвращает год
-
toDateString(): возвращает полную дату в виде строки
-
getHours(): возвращает час (от 0 до 23)
-
getMinutes(): возвращает минуты (от 0 до 59)
-
getSeconds(): возвращает секунды (от 0 до 59)
-
getMilliseconds(): возвращает миллисекунды (от 0 до 999)
-
toTimeString(): возвращает полное время в виде строки
Получим текущую дату:
var days = ; var months = ; var myDate = new Date(); var fullDate = "Сегодня: " + myDate.getDate() + " " + months + " " + myDate.getFullYear() + ", " + days; document.write(fullDate); // Сегодня: 18 Август 2015, Вторник
Перевести из числовых значений в более привычные названия для дней недели и месяцев используются массивы. Получив индекс дня недели ()
и индекс месяца () можно получить нужный элемент из массива.
Теперь получим текущее время:
var welcome; var myDate = new Date(); var hour = myDate.getHours(); var minute = myDate.getMinutes(); var second = myDate.getSeconds(); if (minute < 10) { minute = "0" + minute; } if (second < 10) { second = "0" + second; } if (hour < 12) { welcome = "Доброе утро"; } else if (hour < 17) { welcome = "Добрый день"; } else { welcome = "Добрый вечер"; } document.write(welcome + ", текущее время: " + hour + ":" + minute + ":" + second); // Добрый вечер, текущее время: 22:50:39
Установка даты и времени
Коме задания параметров даты в конструкторе для установки мы также можем использовать дополнительные методы объекта Date:
-
setDate(): установка дня в дате
-
setMonth(): уставовка месяца (отсчет начинается с нуля, то есть месяц с номер 0 — январь)
-
setFullYear(): устанавливает год
-
setHours(): установка часа
-
setMinutes(): установка минут
-
setSeconds(): установка секунд
-
setMilliseconds(): установка миллисекунд
Установим дату:
var days = ; var months = ; var myDate = new Date(); myDate.setDate(15); myDate.setMonth(6); myDate.setYear(2013); var fullDate = myDate.getDate() + " " + months + " " + myDate.getFullYear() + ", " + days; document.write(fullDate); // 15 Июль 2013, Понедельник
При установке значений мы можем передать величину, большую, чем максимальное допустимое значение. Например, установить для часа число 54:
myDate.setHour(54);
В этом случае значение часа будет равно 54 — 24 * 2 = 6, а оставшиеся часы будут составлять два дня (24 * 2), что прибавит к дате два дня. То же самое действует и
в отношении дней, минут, секунд, миллисекунд и месяцев.
НазадВперед
База данных часовых поясов IANA
По правде говоря, часовые пояса — это скорее база данных, чем набор правил, потому что они должны содержать все соответствующие исторические изменения. Существует несколько стандартных баз данных, предназначенных для обработки проблем с часовыми поясами, и наиболее часто используемой из них является База данных часовых поясов IANA. База данных часовых поясов IANA, также называемая базой данных tz (или tzdata), содержит исторические данные о местном стандартном времени по всему миру и изменениях летнего времени. Эта база данных организована так, чтобы содержать все исторические данные, которые в настоящее время можно проверить, чтобы гарантировать точность времени, начиная со времени Unix (1970.01 / 01 00:00:00). В ней также есть данные до 1970 года, но их точность не гарантируется.
Соглашение об именовании соответствует правилу Area/Location. Area обычно относится к названию континента или океана (Азия, Америка, Тихий океан), в то время как Location — к названию крупных городов, таких как Сеул и Нью-Йорк, а не к названию стран (это потому, что продолжительность жизни страны намного короче, чем города). Например, часовой пояс Кореи — Азия / Сеул, а часовой пояс Японии — Азия / Токио. Хотя эти две страны находятся географически в регионе, где принят стандартный offset , они имеют разную историю изменений часовых поясов. Вот почему в этом стандарте они обрабатываются с использованием разных часовых поясов.
База данных часовых поясов IANA поддерживается многочисленными сообществами разработчиков и историков. Новые исторические факты и политические решения сразу же попадают в базу данных, что делает ее наиболее надежным источником. Более того, многие ОС на базе UNIX, включая Linux и macOS, а также популярные языки программирования, включая Java и PHP, используют эту базу данных.
Обратите внимание, что Windows отсутствует в приведенном выше списке поддержки. Это потому, что Windows использует собственную базу данных под названием Microsoft Time Zone Database
Однако эта база данных неточно отражает исторические изменения и поддерживается только Microsoft. Следовательно, она менее точна и надежна, чем IANA.
Introduction
I needed a JavaScript date format function such as the Visual Basic function, in which you can pass a format string; my first approach was to issue a series of consecutive and «destructive» replace calls, but upon discovering that the 5.5 (or higher) version of JScript supported the use of a function as the argument of the method, I got creative.
Here’s an example call of what I wanted:
JavaScript
Copy Code
SomeDiv.innerText = (new Date()).format('dddd, mmmm dd, yyyy.');
This would display:
Copy Code
Saturday, July 16, 2005
So in my first approach, I globally and case-insensitively replaced dddd with the corresponding string, which «destroyed» every occurrence, so that later in the code I could replace dd with the date number.
This worked just fine, but I knew that by inspecting the format specifier for a match, I could skip the search of every format specifier; say I only want the month and the date; well, by switching upon the format specifier (or rather «datepart» specifier), the year replacement will never be issued. Get it?
The fun part relies in the use of a function in the argument of the method; this way the property as a function argument always represents the last match.
Other considerations include the format or «datepart» specifiers: none other than will be parsed as the year; months and days have the usual three flavors of fullname (), three-letter () or numeric (); hours () can be rectified to the 12-hour format with the specifier, and minutes () and seconds () may also be specified.
Displaying Dates
JavaScript will (by default) output dates in full text string format:
When you display a date object in HTML, it is automatically converted to a
string, with the method.
d = new Date();
document.getElementById(«demo»).innerHTML = d;
Same as:
d = new Date();
document.getElementById(«demo»).innerHTML = d.toString();
The method converts a date to a UTC string (a date display
standard).
var d = new Date();
document.getElementById(«demo»).innerHTML = d.toUTCString();
The method converts a date to a more readable
format:
var d = new Date();
document.getElementById(«demo»).innerHTML = d.toDateString();
The method converts a date to a string, using the ISO standard format:
Implementation
WOFA, (Without Further Adou):
JavaScript
Copy Code
var gsMonthNames = new Array( 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ); var gsDayNames = new Array( 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ); Date.prototype.format = function(f) { if (!this.valueOf()) return ' '; var d = this; return f.replace(/(yyyy|mmmm|mmm|mm|dddd|ddd|dd|hh|nn|ss|a\/p)/gi, function($1) { switch ($1.toLowerCase()) { case 'yyyy': return d.getFullYear(); case 'mmmm': return gsMonthNames; case 'mmm': return gsMonthNames.substr(, 3); case 'mm': return (d.getMonth() + 1).zf(2); case 'dddd': return gsDayNames; case 'ddd': return gsDayNames.substr(, 3); case 'dd': return d.getDate().zf(2); case 'hh': return ((h = d.getHours() % 12) ? h : 12).zf(2); case 'nn': return d.getMinutes().zf(2); case 'ss': return d.getSeconds().zf(2); case 'a/p': return d.getHours() < 12 ? 'a' : 'p'; } } ); }
Преобразование даты в строку и её форматирование
В JavaScript методы, выполняющие преобразование даты в строку, можно разделить на 2 группы.
К первой группе можно отнести методы, которые выполняют это так, как это определено в браузере: , , , .
Метод возвращает полное представление даты, – только дату, – только время, – полное представление даты, но в часовом поясе UTC+0.
Т.к. строковые представления, которые должны возвращать эти методы чётко не определены в стандарте, то они могут отличаться в разных браузерах.
Ко второй группе можно отнести методы с учётом часового пояса и языка локального компьютера: – дату и время, – только дату, – только время.
Методы , , имеют 2 необязательных параметра. Первый параметр предназначен для явного указания локали, второй — для задания опций форматирования.
Если локаль явно не установлена или , то браузер берёт ту, которую он имеет по умолчанию.
Кроме этого, в JavaScript имеется ещё метод . Он возвращает строку, содержащую дату и время в формате ISO ().
Пример:
// создадим дату 15.04.2019 18:43:59 (в часовом поясе пользователя) var newDate = new Date(2019, 03, 15, 18, 43, 59); console.log(newDate.toString()); // Mon Apr 15 2019 18:43:59 GMT+1000 (Владивосток, стандартное время) console.log(newDate.toDateString()); // Mon Apr 15 2019 console.log(newDate.toTimeString()); // 18:43:59 GMT+1000 (Владивосток, стандартное время) console.log(newDate.toLocaleString()); // 15.04.2019, 18:43:59 console.log(newDate.toLocaleDateString()); // 15.04.2019 console.log(newDate.toLocaleTimeString()); // 18:43:59 console.log(newDate.toUTCString()); // Mon, 15 Apr 2019 08:43:59 GMT console.log(newDate.toISOString()); // 2019-04-15T08:43:59.000Z
Другие примеры
Пример — Измерение времени выполнения:
Пример — Сравнение дат с помощью объекта Date:
Довольно простой и эффективный способ.
Пример — Текущее время:
Пример — Создание читаемой даты:
В случае с методом , мы добавили к результату 1. Это нужно потому, что этот метод возвращает месяц числом, начиная с 0. Такая вот особенность JavaScript.
Есть ещё одна проблема — форматирование. Инструкция выдаст результат, который будет подобен следующему:
Было бы здорово добавить недостающий ‘0’ перед секундами и месяцем, чтобы получить результат в удобном для нас виде:
Просто добавим условие в код, который генерирует финальную строку:
Этот код мы увидим в следующем, чуть более сложном примере.
Пример — Собственная функция форматирования даты:
После выполнения код будет отображать результат похожий на этот:
Это полный пример кода, который отображает дату и время в JavaScript. Он также демонстрирует, как действуют методы объекта Date.
JavaScript и База данных часовых поясов IANA
Как я вкратце упомянул ранее, поддержка часового пояса в JavaScript довольно плохая. Поскольку по умолчанию он следует часовому поясу определенного региона (точнее, часовому поясу, выбранному во время установки ОС), возможности изменить его на новый часовой пояс нет. Кроме того, его спецификация для стандарта баз данных так же плохо определена, вы заметите это, если внимательно ознакомитесь с документацией ES2015. В отношении местного часового пояса и доступности летнего времени существует лишь несколько неопределенных заявлений. Например, летнее время определяется следующим образом: .
В зависимости от реализации, алгоритм использует наилучшую доступную информацию о часовых поясах для определения местной поправки на летнее время DaylightSavingTA (t), измеряемой в миллисекундах. Ожидается, что реализация ECMAScript сделает все возможное, чтобы определить местное летнее время.
Похоже, он просто говорит: «Эй, ребята, попробуйте и сделайте все возможное, чтобы это сработало». Это создает проблемы в кроссбраузерности. Вы можете подумать: «Это небрежно!», и тогда вы заметите еще одну строчку прямо под ним:
ПРИМЕЧАНИЕ. рекомендуется использовать информацию о часовых поясах из базы данных часовых поясов IANA http://www.iana.org/time-zones/.
Спецификации ECMA признается, что не имеет специальной стандартной базы данных в JavaScript и рекомендует использовать базу данных часовых поясов IANA. В результате разные браузеры используют свои собственные решения для расчета часовых поясов, и они часто несовместимы друг с другом. Позже в ECMA-402 добавили возможность использовать часовой пояс IANA в виде Intl.DateTimeFormat для ECMAScript Internationalization API. Однако этот вариант по-прежнему гораздо менее надежен, чем в других языках программирования.
Часовой пояс в серверно-клиентской среде
Мы предположим простой сценарий, в котором необходимо учитывать часовой пояс. Допустим, мы собираемся разработать простое приложение-календарь, которое будет обрабатывать информацию о времени. Когда пользователь вводит дату и время в поле на странице реестра в клиентской среде, данные передаются на сервер и сохраняются в БД. Затем клиент получает зарегистрированные данные расписания с сервера и отображает их на экране.
Однако здесь есть то, что нужно учесть. Что, если некоторые из клиентов, обращающихся к серверу, находятся в разных часовых поясах? Расписание, зарегистрированное на 11 марта 2017 г. в 11:30 в Сеуле, должно отображаться как 10 марта 2017 г. в 21:30 при просмотре расписания в Нью-Йорке. Чтобы сервер поддерживал клиентов из разных часовых поясов, расписание, хранимое на сервере, должно иметь абсолютные значения, на которые не влияют часовые пояса. Каждый сервер имеет свой способ хранения абсолютных значений, и это выходит за рамки данной статьи, поскольку все зависит от сервера или среды базы данных. Однако для того, чтобы это работало, дата и время, передаваемые от клиента на сервер, должны быть значениями, основанными на том же смещении (обычно в формате UTC) или значениями, которые также включают данные часового пояса клиентской среды.
Обычно такие данные передаются в форме времени Unix на основе UTC или ISO-8601, содержащего информацию о смещении. В приведенном выше примере, если 11:30 утра 11 марта 2017 г. в Сеуле необходимо преобразовать во время Unix, это будет целочисленный тип со значением 1489199400. В соответствии с ISO-8601 это будет строковый тип, значение которого: .
Если вы работаете с этим с помощью JavaScript в среде браузера, вы должны преобразовать введенное значение, как описано выше, а затем преобразовать его обратно в соответствии с часовым поясом пользователя. Необходимо учитывать обе эти две задачи. В языке программирования первый называется «синтаксическим анализом», а второй «форматированием». Теперь давайте выясним, как это обрабатывается в JavaScript.
Даже когда вы работаете с JavaScript в серверной среде с использованием Node.js, возможно вам может потребоваться проанализировать данные, полученные от клиента. Однако, поскольку серверы обычно синхронизируют свой часовой пояс с базой данных, а задача форматирования обычно предоставляется клиентам, вам нужно учитывать меньше факторов, чем в среде браузера. В этой статье мы будем рассматривать примеры в среде браузера.
Summary
- Date and time in JavaScript are represented with the Date object. We can’t create “only date” or “only time”: objects always carry both.
- Months are counted from zero (yes, January is a zero month).
- Days of week in are also counted from zero (that’s Sunday).
- auto-corrects itself when out-of-range components are set. Good for adding/subtracting days/months/hours.
- Dates can be subtracted, giving their difference in milliseconds. That’s because a becomes the timestamp when converted to a number.
- Use to get the current timestamp fast.
Note that unlike many other systems, timestamps in JavaScript are in milliseconds, not in seconds.
Sometimes we need more precise time measurements. JavaScript itself does not have a way to measure time in microseconds (1 millionth of a second), but most environments provide it. For instance, browser has performance.now() that gives the number of milliseconds from the start of page loading with microsecond precision (3 digits after the point):
Node.js has module and other ways. Technically, almost any device and environment allows to get more precision, it’s just not in .
Задание определенной даты
Как получить текущее время мы разобрались, а как создать объект , который бы содержал другую дату или время?
Тут тоже все просто. Чтобы задать определенный день, нужно написать код вида:
Все просто и очевидно, но есть два нюанса:
- Год нужно задавать от 1900.
- Месяцы нумеруются с нуля.
Интересно
Это тоже наследие операционной системы Unix: там программисты обозначали год двумя цифрами. Вместо 1977 писали просто 77. Поэтому 77 станет правильным годом, если мы считаем от 1900 года.
Например, я родился 21 марта 1989 года. Март — третий месяц, значит мне нужно написать
Код | Вывод на экран |
---|---|
Месяцы нумеруются с нуля, а дни — нет. Немного странно, да?
Думаем, настоящие программисты должны были пересилить себя и дни месяца тоже нумеровать с нуля. Ох уж эти конформисты
Задание определенного времени
Задать определенное время тоже достаточно просто: для этого нужно написать команду вида:
Часы, минуты и секунды нумеруются с нуля: программист внутри вас должен вздохнуть спокойно.
Пример:
Код | Вывод на экран |
---|---|
Мы задали время 12:15 и дату 4 июня 2005 года. Читается немного сложновато для не программиста, зато работает как надо.
Автоисправление даты
Автоисправление – это очень полезная особенность объектов . Можно устанавливать компоненты даты вне обычного диапазона значений, а объект сам себя исправит.
Пример:
Неправильные компоненты даты автоматически распределяются по остальным.
Предположим, нам требуется увеличить дату «28 февраля 2016» на два дня. В зависимости от того, високосный это год или нет, результатом будет «2 марта» или «1 марта». Нам об этом думать не нужно. Просто прибавляем два дня. Объект позаботится об остальном:
Эту возможность часто используют, чтобы получить дату по прошествии заданного отрезка времени. Например, получим дату «спустя 70 секунд с текущего момента»:
Также можно установить нулевые или даже отрицательные значения. Например:
JS сравнение дат
В JavaScript для сравнения дат используются операторы , , и .
const earlier = new Date(2019, 0, 26) const later = new Date(2019, 0, 27) console.log(earlier < later) // true
Сложнее сравнить даты по времени суток (часам и минутам). Вы не сможете сравнить их с помощью или :
const a = new Date(2019, 0, 26) const b = new Date(2019, 0, 26) console.log(a == b) // false console.log(a === b) // false
Чтобы проверить, совпадает ли в двух датах значение времени, нужно сравнить их временные метки с помощью .
const isSameTime = (a, b) => { return a.getTime() === b.getTime() } const a = new Date(2019, 0, 26) const b = new Date(2019, 0, 26) console.log(isSameTime(a, b)) // true
Чтобы проверить, совпадают ли в датах дни недели, сравните их значения с помощью методов , и .
const isSameDay = (a, b) => { return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate()=== b.getDate() } const a = new Date(2019, 0, 26, 10) // 26 января 2019, 10:00 const b = new Date(2019, 0, 26, 12) // 26 января 2019, 12:00 console.log(isSameDay(a, b)) // true
Методы объекта FormData
С помощью указанных ниже методов мы можем изменять поля в объекте :
- – добавляет к объекту поле с именем и значением ,
- – добавляет поле, как будто в форме имеется элемент , третий аргумент устанавливает имя файла (не имя поля формы), как будто это имя из файловой системы пользователя,
- – удаляет поле с заданным именем ,
- – получает значение поля с именем ,
- – если существует поле с именем , то возвращает , иначе
Технически форма может иметь много полей с одним и тем же именем , поэтому несколько вызовов добавят несколько полей с одинаковыми именами.
Ещё существует метод , его синтаксис такой же, как у . Разница в том, что удаляет все уже имеющиеся поля с именем и только затем добавляет новое. То есть этот метод гарантирует, что будет существовать только одно поле с именем , в остальном он аналогичен :
- ,
- .
Поля объекта можно перебирать, используя цикл :
GMT, UTC и Offset
GMT (время по Гринвичу)Местное время в Корее обычно . GMT — это сокращение от среднего времени по Гринвичу, которое является временем на часах Королевской Обсерватории в Гринвиче, Великобритания, расположенной на долготе 0. Система GMT начала распространяться 5 февраля 1925 года и была мировым стандартом времени до 1 января 1972 года.
UTC (универсальное глобальное время)Многие считают GMT и UTC одним и тем же, и во многих случаях они взаимозаменяемы, но на самом деле у них есть существенные отличия. UTC было создано в 1972 году для компенсации проблемы замедления вращения Земли. Эта система времени основана на Международном атомном времени, которое использует атомную частоту цезия для установки стандарта времени. Другими словами, UTC — более точная система. Хотя фактическая разница во времени между ними мала, UTC является более точным выбором для разработчиков программного обеспечения.
Когда система еще находилась в разработке, англоязычное население хотело назвать систему CUT (всемирное координированное время), а франкоязычное население хотело назвать ее TUC (Мировое время). Однако ни одна из сторон не выиграла бой, поэтому они пришли к соглашению об использовании аббревиатуры UTC, поскольку она содержала все основные буквы (C, T и U).
Offset (смещение часового пояса относительно часового пояса UTC) в означает, что местное время на 9 часов опережает стандартное время UTC. Это означает, что когда в Корее 21:00, в регионе — полдень, 12:00. Разница во времени между стандартным временем UTC и местным временем называется смещением (offset), которое выражается следующим образом: , и т. д.
Часто страны называют свои часовые пояса своими уникальными именами. Например, часовой пояс Кореи называется KST (стандартное время Кореи) и имеет определенное значение смещения, которое выражается как KST = . Однако смещение также используется не только Кореей, но и Японией, Индонезией и многими другими, что означает, что отношение между смещениями и именами часовых поясов не 1:1, а 1:N. Список стран со смещением можно найти в википедии на странице UTC+09:00.
Некоторые смещения не производятся строго на почасовой основе. Например, в Северной Корее в качестве стандартного времени используется , а в Австралии или , в зависимости от региона.
Полный список смещений UTC и их названия можно найти здесь: Список смещений времени UTC.
Time zone !== offset?Как я уже упоминал ранее, мы используем названия часовых поясов (KST, JST) взаимозаменяемо со смещением, не различая их. Но это неправильно рассматривать время и смещение в определенном регионе одинаково, по следующим причинам:
Летнее время (DST)Хотя это понятие может быть неизвестно в некоторых странах, во многих странах летнее время официально принято — в частности, в США, Великобритании и странах Европы. На международном уровне летнее время обычно называется Daylight Saving Time (DST). Во время перехода на DST мы переводим стрелки часов на один час вперед от стандартного времени в летнее время.
Например, в Калифорнии в США зимой используется PST (стандартное тихоокеанское время, ), а летом — PDT (тихоокеанское летнее время, ). Регионы Северной Америки, в которых используются два часовых пояса, вместе называются Тихоокеанским временем (PT), и это название принято во многих регионах США и Канады.
Теперь самое интересное: когда именно начинается и заканчивается лето? На самом деле, даты начала и окончания летнего времени остаются на собственное усмотрение каждой страны. Это раз. А два — страна может поменять время и до изменения мы должны будем учитывать одно время, а после изменения — другое.
Например, до 2006 года в США и Канаде летнее время начиналось с первого воскресенья апреля в 02:00 и длилось до последнего воскресенья октября в 12:00, а с 2007 года стало начинаться во второе воскресенье марта с 02:00 и длиться до 2:00 первого воскресенья ноября. В европейских странах летнее время применяется единовременно по всей стране, в то время как в США летнее время поочередно применяется к часовым поясам.