Часовой пояс
Что такое часовой пояс?
На Международной конференции по долготе (также известной как Международная конференция по меридианам), состоявшейся в Вашингтоне в 1884 году, было оговорено, что мир должен быть разделен на 24 часовых пояса (по 12 часовых поясов на востоке и западе). предусматривает, что Соединенное Королевство (Обсерватория зеленых украшенийстарый адрес) длясредний часовой пояс(Нулевой часовой пояс), Восток 1-12, Запад 1-12. Каждый часовой пояс охватывает 15 градусов долготы, а время составляет ровно 1 час.
Классификация часовых поясов
Теоретический часовой пояс
Приведенное выше определение часового пояса на самом делеТеоретический часовой пояс. Время в теоретическом часовом поясе находится на его центральном меридиане (или стандартном меридиане). Например, диапазон долготы Восточного Восьмого округа составляет 112,5 ° в.д. ~ 127,5 ° в.д., а центральный меридиан - 120 ° в.д.
Таким образом, для каждой разницы часовых поясов разница во времени составляет один час, а разница составляет столько часов, сколько разница часовых поясов. Время в восточном часовом поясе раньше, чем время в западном часовом поясе.
легальный часовой пояс
Восстановление огромной страны охватывает несколько часовых поясов, часто с внутренними административными границами страны в качестве границ часовых поясов. Этофактический часовой пояс,Прямо сейчаслегальный часовой пояс.
Например, географическое деление Китая, запад до 75° в.д., восток до 135° в.д., охватывает несколько часовых поясов, но на самом деле законным часовым поясом нашей страны является стандартное время восточно-восьмого округа. Студенты, живущие в западной части моей страны, например, в Синьцзяне, должны глубоко переживать: в 6:00 по пекинскому времени может быть еще 3:00 по местному времени, а небо темное.
Соединенные Штаты также охватывают несколько часовых поясов, но континентальная часть Соединенных Штатов использует западное время (-8), горное время (-7), центральное время (-6), восточное время (-5), всего четыре часовых пояса ( Аляска и Гавайи) острова -8 и -10 соответственно). Поэтому просто сказать, что часовой пояс США -8, неверно.
Международная линия перемены дат
Центральный меридиан Восточного 12-го округа и Западного 12-го округа на самом деле имеет долготу 180 °. Во избежание существования нового дня и старого дня в одном и том же часовом поясе долгота от 180 ° к западу до 0:00 искусственно определяется как новый день Восток — это старый день.
Однако в Тихом океане есть некоторые страны, административное деление которых простирается на 180° долготы.Для удобства управления международная линия перемены дат на самом деле не является прямой линией.
Как упоминалось ранее,Теоретический часовой поясОн включает только 24 часовых пояса от 12-го западного округа до 12-го восточного округа. Однако в конце 29 декабря 2011 года тихоокеанское государство Самоа скорректировало стандартное время с востока от международной линии перемены дат на запад от международной линии перемены дат, то есть с часового пояса UTC-11 на UTC+13 ( летнее время изменено с UTC-10 на UTC+14). Следовательно, в текущем международном стандарте часовых поясов есть «восточная 13-я зона».
// 太平洋阿皮亚地区的时区
moment().tz('Pacific/Apia').format('Z')
// "+13:00"
общие стандарты времени
Обычно, когда речь идет о часовых поясах, упоминаются именно эти термины.UTC
,GMT
,DST
,CST
, что обозначают эти существительные?
GMT
время по ГринвичуGreenwich Mean Time, представлятьвремя по Гринвичу.
Как упоминалось ранее, Международная конференция по долготе в 1884 году решила выбрать гринвичский меридиан в качестве нулевого градуса долготы, разделяющего восточное и западное полушария земли. Еще в семнадцатом веке Королевская обсерватория в Гринвиче вела небесные наблюдения для расширения Британской империи, морского гегемона.
Для мира время, установленное здесь, является точкой отсчета мирового времени, и мир использует время по Гринвичу в качестве стандарта для установки времени.
new Date()
// Sat Jun 15 2019 17:55:58 GMT+0800 (中国标准时间)
new Date('2020-10-10 00:08:19')
// Sat Oct 10 2020 00:08:19 GMT+0800 (中国标准时间)
Часто упоминаемая метка времени timestamp относится к общему количеству секунд с 00:00:00 01 января 1970 г. (GMT+8:00:00 1 января 1970 г.) до настоящего времени, js. вплоть до миллисекундного уровня.
new Date('1970-01-01').getTime();
// 0
new Date('1969-12-31').getTime();
// -86400000
UTC
Всемирное координированное времяCoordinated Universal Time,представлятьВсемирное координированное времяилиВсемирное координированное время.
UTC — это время, рассчитанное по среднему солнечному времени (на основе среднего времени по Гринвичу по Гринвичу), новой шкале времени, скорректированной с учетом движения земной оси, и международному атомному времени в «секундах».Процесс расчета является достаточно строгим и точным. Всемирное координированное время — одна из нескольких альтернативных систем времени, наиболее близких к GMT.
Широко распространено мнение, что время UTC считается взаимозаменяемым со временем по Гринвичу, но время по Гринвичу больше не определяется научным сообществом.
Вообще говоря, когда мы говорим овремя UTCБез каких-либо других изменений это обычно относится к UTC 0:00.
Единственная разница между UTC и GMT заключается в том, что в UTC есть дополнительные секунды, а в GMT — нет.
DST
Летнее времяDaylight Saving Time, представлятьлетнее время. Это административное действие, в котором полностью доминируют правительства разных стран, то есть, в отличие от двух географически привязанных стандартов времени GMT и UTC,Летнее время не является стандартом для ссылки на координаты меридиана.
Так называемое летнее время означает перевод часов на один час вперед, когда солнце встает летом раньше, чтобы использовать солнечный свет раньше и сократить расходы на освещение и потребление электроэнергии. В Великобритании это называется Summer Time.
Некоторые страны по всему миру до сих пор используют летнее время.Стоит отметить, что наша страна также использовала летнее время с 1986 по 1991 год., вы можете обратиться кЭнциклопедия Baidu - Летнее времяОписание раздела политики Китая в .
Словом, наша страна летом указанного выше периода,Напечатанный часовой пояс +9 часовой пояс.
new Date('1985-07-01 00:00:00')
// Mon Jul 01 1985 00:00:00 GMT+0800 (中国标准时间)
new Date('1986-07-01 00:00:00')
// Tue Jul 01 1986 00:00:00 GMT+0900 (中国夏令时间)
new Date('1988-07-01 00:00:00')
// Fri Jul 01 1988 00:00:00 GMT+0900 (中国夏令时间)
new Date('1990-07-01 00:00:00')
// Sun Jul 01 1990 00:00:00 GMT+0900 (中国夏令时间)
new Date('1991-07-01 00:00:00')
// Mon Jul 01 1991 00:00:00 GMT+0900 (中国夏令时间)
new Date('1992-07-01 00:00:00')
// Wed Jul 01 1992 00:00:00 GMT+0800 (中国标准时间)
Национальные стандарты
В стандарте часового пояса, используемом в каждой стране/регионе, используются разные сокращения, см.moment.timezone.
Чтобы получить стандарт часового пояса для каждой страны и региона, вы можете использоватьmoment.tz
и топонимы в международных стандартах часовых поясов:
moment().tz('Asia/Shanghai').format('z') // 'CST'
moment().tz('Asia/Tokyo').format('z') // 'JST'
moment().tz('America/Los_Angeles').format('z') // 'PDT' - Pacific Daylight Time
Различные браузеры отображают один и тот же эффект, Chrome будет отображать GMT и стандарт местного часового пояса, который был переведен:
new Date();
// Sat Jun 15 2019 20:36:10 GMT+0800 (中国标准时间)
Safari, с другой стороны, очень внимателен и не переводит:
new Date();
// Thu Oct 10 2019 00:00:00 GMT+0800 (CST)
Вот несколько общих международных стандартов:
BST
То же, что и летнее время, т.е.British Summer Time.
CST
Центральное время: Центральное стандартное время (США) UT-6:00
Центральное время Австралии: Центральное стандартное время (Австралия) UT+9:30
Стандартное время Китая: Стандартное время Китая UT+8:00
Стандартное время Кубы: Стандартное время Кубы UT-4:00
Часовые пояса в JavaScript
Как получить часовой пояс?
Если вы хотите получить часовой пояс даты в js, вы можете использовать его напрямуюDate.prototype.getTimezoneOffset().
var dateLocal = new Date();
var date1 = new Date('August 19, 1975 23:15:30 GMT+07:00');
var date2 = new Date('August 19, 1975 23:15:30 GMT-02:00');
console.log(dateLocal.getTimezoneOffset());
console.log(date1.getTimezoneOffset());
console.log(date2.getTimezoneOffset());
// -480
// -480
// -480
getTimezoneOffset
Возвращаемый результат — это разница между текущим местным временем и временем UTC, выраженная в минутах. вышесказанноеdateLocal
можно понимать как,( 0时区 - 本地时区(+8) ) * 60min = -480
.
Итак, чтобы получить стандартный часовой пояс, например +8 или -8, нужно сделать следующее:
// 使用原生 js
var date = new Date().getTimezoneOffset();
var timezone = -date;
console.log(timezone); // 480
console.log(timezone / 60); // 8
// 使用 moment (moment是基于local - utc得到的)
var date = moment();
var timezone = date.utcOffset();
console.log(timezone); // 480
console.log(timezone / 60); // 8
Увидев результаты вывода, вы можете спросить, почему результаты вывода date1 и date2 не равны +7 и -2?
Ответ на этот вопрос будет позже.
Как установить часовой пояс?
Объект Date предоставляет методы для установки даты и времени для экземпляра, но не поддерживает изменение часового пояса экземпляра.
Для получения подробной информации см.Методы, предоставляемые Date.prototype.
Дополнение 1: Как создать экземпляр объекта даты?
Date Creation | Output |
---|---|
new Date() |
Current date and time |
new Date(timestamp) |
Creates date based on milliseconds since Epoch time |
new Date(date string) |
Creates date based on date string |
new Date(year, month, day, hours, minutes, seconds, milliseconds) |
Creates date based on specified date and time |
Существует много типов строк даты, вы можете обратиться кРезюме MDN
Стандартные типы ISO:
-
"2019-06-10"
(date-only form) -
"2019-06-10T14:48:00"
(date-time form) -
"2019-06-10T14:48:00.000+09:00"
(date-time form with milliseconds and time zone) -
"2019-06-10T00:00:00.000Z"
(указание часового пояса UTC с помощью спецификации даты ISO, Z совпадает с +00:00)
Некоторые нестандартные типы ISO:
Aug 9, 1995
Wed, 09 Aug 1995 00:00:00
Wed, 09 Aug 1995 00:00:00 GMT
Дополнение 2: Как получить дату и время в js?
Date/Time | Method | Range | Example |
---|---|---|---|
Year | getFullYear() |
YYYY | 1970 |
Month | getMonth() |
0-11 | 0 = January |
Day (of the month) | getDate() |
1-31 | 1 = 1st of the month |
Day (of the week) | getDay() |
0-6 | 0 = Sunday |
Hour | getHours() |
0-23 | 0 = midnight |
Minute | getMinutes() |
0-59 | |
Second | getSeconds() |
0-59 | |
Millisecond | getMilliseconds() |
0-999 | |
Timestamp | getTime() |
Milliseconds since Epoch time |
Общая проблема
1. Часовой пояс передается при создании экземпляра объекта Date.Почему полученный часовой пояс является локальным часовым поясом?
var date1 = new Date('August 19, 1975 23:15:30 GMT+07:00');
var date2 = new Date('August 19, 1975 23:15:30 GMT-02:00');
console.log(date1.getTimezoneOffset());
console.log(date2.getTimezoneOffset());
// -480
// -480
Следует отметить, что независимо от того, как вы создаете экземпляр объекта Date, js преобразует его в местный часовой пояс, когда он хранится локально. js не поможет вам сохранить информацию о часовом поясе при установке даты.
It's important to keep in mind that the date and time is stored in the local time zone, and that the basic methods to fetch the date and time or its components all work in the local time zone as well.
new Date('June 15, 2019 23:15:30 GMT+10:00');
// 东10区的时间,实例化成功后,日期被转换成了本地时区
// Sat Jun 15 2019 21:15:30 GMT+0800 (中国标准时间)
Итак, как я могу получить объект даты, который содержит указанный часовой пояс? ответ,Собственные объекты даты JS не поддерживаются.
Я не могу представить сцену, где одноклассники RD и PM невинно объясняли «JS не может этого сделать», их преследовал и рубил PM, потому что это нормальноmomentподдерживается.
Как показано на рисунке ниже, прямое объявление экземпляра момента не несет никакойoffset
информация, потому что это время UTC, но на основе характеристик js Date, напрямуюtoDate
Распечатанный результат будет отображаться для вас в зависимости от местного часового пояса.
позвонивtz()
мы назначаем часовой пояс экземпляру момента, то есть зоне +9, в которой расположен Токио. В это время вы можете видеть, что экземпляр этого момента имеетoffset
Атрибуты.继续调用format('Z')
Вы можете получить его часовой пояс как «+09: 00».
2. Как обрабатывать строки даты, такие как ГГГГ-ММ-ДД?
В js часто необходимо преобразовать строку даты в объект Date. Если в полученной строке даты есть время, ничего страшного, если это"2019-10-10"
А как быть с такой строкой?
Большинство людей, вероятно, ни о чем не думали и просто звонилиnew Date(datestring)
. Но все не так просто, как представлялось. Давайте сравним:
var date1 = new Date('2019-10-10')
// Thu Oct 10 2019 08:00:00 GMT+0800 (中国标准时间)
var date2 = new Date('2019-10-10 00:00:00')
// Thu Oct 10 2019 00:00:00 GMT+0800 (中国标准时间)
Можно найти, ввод даты и ввода даты + времени, в результате разница в целых восемь часов!
Подробное объяснение дано в MDN:
parsing of date strings with the
Date
constructor (andDate.parse
, they are equivalent) is strongly discouraged due to browser differences and inconsistencies. Support for RFC 2822 format strings is by convention only. Support for ISO 8601 formats differs in that date-only strings (e.g. "1970-01-01") are treated as UTC, not local.
Просто переведите, прямо передайте строку типа «ГГГГ-ММ-ДД» в новую дату и получите экземпляр даты на основе времени UTC. Как упоминалось ранее, время UTC — это стандартное время в часовом поясе 0.
Итак, в приведенном выше примере кодаdate1
При создании экземпляра2019-10-10 00:00:00 GMT+00:00
Это время, а затем преобразованное в местный часовой пояс, добавляет 8 часов.
а такжеdate2
При создании экземпляра2019-10-10 00:00:00
рассматривать какGMT +08:00
часовой пояс, поэтому полученное время равно 0 часов.
Между этими двумя методами нет правильного или неправильного, но вы должны быть очень осторожны при их использовании. Лично не рекомендуюnew Date(YYYY-MM-DD)
Сюда.
Наговорив кучу теорий, на какие сценарии стоит обратить внимание? Покажите код:
// code is runningg on GMT +08:00
const d = new Date('2019-10-10');
const date = d.getDate();
// 10
// Looks good!
// code is runningg on GMT -10:00
const d = new Date('2019-10-10');
const date = d.getDate();
// 9
// Amazing?!
Подводя итог приведенному выше коду: в месте с часовым поясом меньше 0 создайте экземпляр даты и получите дату непосредственно с новой датой ('ГГГГ-ММ-ДД'), всегда будет на один день меньше. Но использование новой даты ('ГГГГ-ММ-ДД 00:00:00') не работает.
Вышеупомянутая проблема может быть легко решена с помощью момента:
moment('2019-10-10').toDate()
// Thu Oct 10 2019 00:00:00 GMT+0800 (中国标准时间)
moment('2019-10-10 00:00:00').toDate()
// Thu Oct 10 2019 00:00:00 GMT+0800 (中国标准时间)
3. Почему сафари всегда сообщает об ошибке при вызове новой даты?
Следующий код выдает ошибку:
new Date('2019-10-10 00:00:00')
// Invalid Date
Старые драйверы могут знать, что в сафари всегда была вышеуказанная ошибка.Чтобы решить эту проблему, вы можете использовать следующий код:
new Date('2019/10/10 00:00:00')
// Thu Oct 10 2019 00:00:00 GMT+0800 (CST)
4. Какие есть полезные библиотеки инструментов для работы с часовыми поясами и датами?
-
Moment.js - Parse, validate, manipulate, and display dates and times in JavaScript
-
Moment Timezone - Parse and display dates in any timezone
-
DAY.JS - A minimalist JavaScript library for modern browsers with a largely Moment.js-compatible API
-
date-fns - Modern JavaScript date utility library
Ссылаться на
Автор статьи: Лю Чэнчуань (EE People Team)
Приглашайте выдающихся людей вместе делать сложные дела! Команда инженеров по эффективности ByteDance набирает сотрудников на позиции R&D.Если вы хотите стать партнером технологического гиганта, приходите и убедитесь!Введение в работу