Localtime дать местное время


Содержание

Дата и Время

Материал на этой странице устарел, поэтому скрыт из оглавления сайта.

Более новая информация по этой теме находится на странице https://learn.javascript.ru/date.

Для работы с датой и временем в JavaScript используются объекты Date.

Создание

Для создания нового объекта типа Date используется один из синтаксисов:

Создаёт объект Date с текущей датой и временем:

Создаёт объект Date , значение которого равно количеству миллисекунд (1/1000 секунды), прошедших с 1 января 1970 года GMT+0.

Если единственный аргумент – строка, используется вызов Date.parse (см. далее) для чтения даты из неё.

new Date(year, month, date, hours, minutes, seconds, ms)

Дату можно создать, используя компоненты в местной временной зоне. Для этого формата обязательны только первые два аргумента. Отсутствующие параметры, начиная с hours считаются равными нулю, а date – единице.

Год year должен быть из 4 цифр.

Отсчёт месяцев month начинается с нуля 0.

Дата задана с точностью до миллисекунд:

Получение компонентов даты

Для доступа к компонентам даты-времени объекта Date используются следующие методы:

getFullYear() Получить год (из 4 цифр) getMonth() Получить месяц, от 0 до 11. getDate() Получить число месяца, от 1 до 31. getHours(), getMinutes(), getSeconds(), getMilliseconds() Получить соответствующие компоненты.

Некоторые браузеры реализуют нестандартный метод getYear() . Где-то он возвращает только две цифры из года, где-то четыре. Так или иначе, этот метод отсутствует в стандарте JavaScript. Не используйте его. Для получения года есть getFullYear() .

Дополнительно можно получить день недели:

getDay() Получить номер дня в неделе. Неделя в JavaScript начинается с воскресенья, так что результат будет числом от 0(воскресенье) до 6(суббота).

Все методы, указанные выше, возвращают результат для местной временной зоны.

Существуют также UTC-варианты этих методов, возвращающие день, месяц, год и т.п. для зоны GMT+0 (UTC): getUTCFullYear() , getUTCMonth() , getUTCDay() . То есть, сразу после «get» вставляется «UTC» .

Если ваше локальное время сдвинуто относительно UTC, то следующий код покажет разные часы:

Кроме описанных выше, существуют два специальных метода без UTC-варианта:

Возвращает число миллисекунд, прошедших с 1 января 1970 года GMT+0, то есть того же вида, который используется в конструкторе new Date(milliseconds) .

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

Установка компонентов даты

Следующие методы позволяют устанавливать компоненты даты и времени:

  • setFullYear(year [, month, date])
  • setMonth(month [, date])
  • setDate(date)
  • setHours(hour [, min, sec, ms])
  • setMinutes(min [, sec, ms])
  • setSeconds(sec [, ms])
  • setMilliseconds(ms)
  • setTime(milliseconds) (устанавливает всю дату по миллисекундам с 01.01.1970 UTC)

Все они, кроме setTime() , обладают также UTC-вариантом, например: setUTCHours() .

Как видно, некоторые методы могут устанавливать несколько компонентов даты одновременно, в частности, setHours . При этом если какая-то компонента не указана, она не меняется. Например:

Автоисправление даты

Автоисправление – очень удобное свойство объектов Date . Оно заключается в том, что можно устанавливать заведомо некорректные компоненты (например 32 января), а объект сам себя поправит.

Неправильные компоненты даты автоматически распределяются по остальным.

Например, нужно увеличить на 2 дня дату «28 февраля 2011». Может быть так, что это будет 2 марта, а может быть и 1 марта, если год високосный. Но нам обо всем этом думать не нужно. Просто прибавляем два дня. Остальное сделает Date :

Также это используют для получения даты, отдалённой от имеющейся на нужный промежуток времени. Например, получим дату на 70 секунд большую текущей:


Можно установить и нулевые, и даже отрицательные компоненты. Например:

Преобразование к числу, разность дат

Когда объект Date используется в числовом контексте, он преобразуется в количество миллисекунд:

Важный побочный эффект: даты можно вычитать, результат вычитания объектов Date – их временная разница, в миллисекундах.

Это используют для измерения времени:

Бенчмаркинг

Допустим, у нас есть несколько вариантов решения задачи, каждый описан функцией.

Как узнать, какой быстрее?

Для примера возьмём две функции, которые бегают по массиву:

Чтобы померить, какая из них быстрее, нельзя запустить один раз walkIn , один раз walkLength и замерить разницу. Одноразовый запуск ненадёжен, любая мини-помеха исказит результат.

Для правильного бенчмаркинга функция запускается много раз, чтобы сам тест занял существенное время. Это сведёт влияние помех к минимуму. Сложную функцию можно запускать 100 раз, простую – 1000 раз…

Померяем, какая из функций быстрее:

Теперь представим себе, что во время первого бенчмаркинга bench(walkIn) компьютер что-то делал параллельно важное (вдруг) и это занимало ресурсы, а во время второго – перестал. Реальная ситуация? Конечно реальна, особенно на современных ОС, где много процессов одновременно.

Гораздо более надёжные результаты можно получить, если весь пакет тестов прогнать много раз.

В современных браузерах (кроме IE9-) вызов performance.now() возвращает количество миллисекунд, прошедшее с начала загрузки страницы. Причём именно с самого начала, до того, как загрузился HTML-файл, если точнее – с момента выгрузки предыдущей страницы из памяти.

Так что это время включает в себя всё, включая начальное обращение к серверу.

Его можно посмотреть в любом месте страницы, даже в , чтобы узнать, сколько времени потребовалось браузеру, чтобы до него добраться, включая загрузку HTML.

Возвращаемое значение измеряется в миллисекундах, но дополнительно имеет точность 3 знака после запятой (до миллионных долей секунды!), поэтому можно использовать его и для более точного бенчмаркинга в том числе.

Для измерения с одновременным выводом результатов в консоли есть методы:

  • console.time(метка) – включить внутренний хронометр браузера с меткой.
  • console.timeEnd(метка) – выключить внутренний хронометр браузера с меткой и вывести результат.

Параметр «метка» используется для идентификации таймера, чтобы можно было делать много замеров одновременно и даже вкладывать измерения друг в друга.

В коде ниже таймеры walkIn , walkLength – конкретные тесты, а таймер «All Benchmarks» – время «на всё про всё»:

При запуске этого примера нужно открыть консоль, иначе вы ничего не увидите.

Современные интерпретаторы JavaScript делают массу оптимизаций, например:

  1. Автоматически выносят инвариант, то есть постоянное в цикле значение типа arr.length , за пределы цикла.
  2. Стараются понять, значения какого типа хранит данная переменная или массив, какую структуру имеет объект и, исходя из этого, оптимизировать внутренние алгоритмы.
  3. Выполняют простейшие операции, например сложение явно заданных чисел и строк, на этапе компиляции.
  4. Могут обнаружить, что некий код, например присваивание к неиспользуемой локальной переменной, ни на что не влияет и вообще исключить его из выполнения, хотя делают это редко.

Эти оптимизации могут влиять на результаты тестов, поэтому измерять скорость базовых операций JavaScript («проводить микробенчмаркинг») до того, как вы изучите внутренности JavaScript-интерпретаторов и поймёте, что они реально делают на таком коде, не рекомендуется.

Форматирование и вывод дат

Во всех браузерах, кроме IE10-, поддерживается новый стандарт Ecma 402, который добавляет специальные методы для форматирования дат.

Это делается вызовом date.toLocaleString(локаль, опции) , в котором можно задать много настроек. Он позволяет указать, какие параметры даты нужно вывести, и ряд настроек вывода, после чего интерпретатор сам сформирует строку.

Пример с почти всеми параметрами даты и русским, затем английским (США) форматированием:

Вы сможете подробно узнать о них в статье Intl: интернационализация в JavaScript, которая посвящена этому стандарту.

Методы вывода без локализации:

toString() , toDateString() , toTimeString() Возвращают стандартное строчное представление, не заданное жёстко в стандарте, а зависящее от браузера. Единственное требование к нему – читаемость человеком. Метод toString возвращает дату целиком, toDateString() и toTimeString() – только дату и время соответственно.

toUTCString() То же самое, что toString() , но дата в зоне UTC.


toISOString() Возвращает дату в формате ISO Детали формата будут далее. Поддерживается современными браузерами, не поддерживается IE8-.

Если хочется иметь большую гибкость и кросс-браузерность, то также можно воспользоваться специальной библиотекой, например Moment.JS или написать свою функцию форматирования.

Разбор строки, Date.parse

Все современные браузеры, включая IE9+, понимают даты в упрощённом формате ISO 8601 Extended.

Этот формат выглядит так: YYYY-MM-DDTHH:mm:ss.sssZ , где:

  • YYYY-MM-DD – дата в формате год-месяц-день.
  • Обычный символ T используется как разделитель.
  • HH:mm:ss.sss – время: часы-минуты-секунды-миллисекунды.
  • Часть ‘Z’ обозначает временную зону – в формате +-hh:mm , либо символ Z , обозначающий UTC. По стандарту её можно не указывать, тогда UTC, но в Safari с этим ошибка, так что лучше указывать всегда.

Также возможны укороченные варианты, например YYYY-MM-DD или YYYY-MM или даже только YYYY .

Как получить правильное местное время, используя функцию asctime и localtime?

17.08.2014, 19:14

Как получить правильное время в формате hh:ss?
Подскажите, как получить нормальное правильное время в джава (мне выдаёт на 2 часа раньше.

Местное время в сетке вещания
Здравствуйте! Подскажите как можно вывести фиксированное время согласно временной зоне зашедшего.

сделайте скрипт который выводит местное время пользователя
заранее спасибо скиньте код и не ругаться на автора

Как можно запустить прогу, не используя функцию Shell, а используя API функцию?
Привет Всем! Подскажите, как можно запустить прогу, не используя функцию Shell, а используя API.

Получить дату и время используя NTP
Реализация, на сколько я понял, для Linux, ибо sys/socket.h и т.п. не поддерживается Windows.

Localtime дать местное время

local time — n [U] the time of day in a particular part of the world ▪ We ll arrive in Boston at 4 o clock local time … Dictionary of contemporary English

local time — ► NOUN ▪ time as reckoned in a particular region or time zone … English terms dictionary

local time — local ,time noun uncount the time in a particular part of the world … Usage of the words and phrases in modern English

local time — noun the official time in a local region (adjusted for location around the Earth); established by law or custom • Syn: ↑civil time, ↑standard time • Hypernyms: ↑time • Hyponyms: ↑Atlantic Time, ↑ … Useful english dictionary

Илон Маск рекомендует:  Диалог в стиле wizard'a

local time — N UNCOUNT Local time is the official time in a particular region or country. It was around 10.15 pm local time, 3.15 am at home … English dictionary

local time — vietinis laikas statusas T sritis Standartizacija ir metrologija apibrėžtis Bet kurio Žemės dienov >Penkiakalbis aiškinamasis metrologijos terminų žodynas

local time — noun (U) the time of day in a particular part of the world: We ll arrive in Boston at 4:00 local time … Longman dictionary of contemporary English

local time — vietinis laikas statusas T sritis Kūno kultūra ir sportas apibrėžtis Bet kuriame Žemės dienov >Sporto terminų žodynas

local time — time within a certain geographical area … English contemporary dictionary

local time — /ˈloʊkəl taɪm/ (say lohkuhl tuym) noun the time at any given place on earth as determined from the position of the sun only; it is local noon when the sun crosses the mer >Australian English dictionary

local time — the time based on the mer >Universalium

Разбираемся в часовыми поясами. Инструкция по безопасной работе со временем

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

Зоны и их преобразования – достаточно тяжелая для изучения тема. Это не проходят в институтах, об этом мало статей на популярных ресурсах. Разработчики учатся работать со временем методом проб и ошибок.

В одном из прошлых проектов в нашей команде не было никого, кто бы мог внятно донести лучшие практики работы со временем. Коллективное незнание было компенсировано харизмой и желанием писать много кода.

Мы воздвигли модуль полный костылей и багов, которые ловили в проде. Провалы становились очевидны когда исправлять их было уже затратно. Скорее всего, в вашем проекте дела обстоят так же.

Не устану повторять случай с коллегой, который работал в лондонском стартапе. Лондон это такой город, от которого отсчитываются часовые пояса, потому что через него проходит нулевой меридиан. Иначе говоря, локальное и общемировое времена в Лондоне одинаковы (не считая обозначения зоны, конечно).

Пока разработка шла в Лондоне, никто и не думал ни про какие зоны, и код писали без их учета. Разработчик с зоной +3 столкнулся с тем, что не проходит ни один тест, потому что время прибито гвоздями без учета пояса. В итоге коллега проработал у них год сидя с переведенными часами. Было проще поменять зону локально, чем исправить код.

Забавно, что бизнес той фирмы был связан с расписанием общественного транспорта, где время имеет решающую роль. Это снова поднимает вопросы о том, кто и как пишет повседневное ПО.

В нашем проекте фронтендер решил, что он умнее системы и что нужно помочь клиенту перевести локальное время в UTC. И тем самым заложил в систему трудноуловимый баг. При отправке объекта Date через Ajax первый автоматически приводится к общемировому времени. Затем срабатывал обработчик коллеги, который тоже корректировал пояс. Получается, что мы дважды вычитали локальное время на клиенте и тем самым портили любую дату с сервера.


Теперь представьте, что будет, если показать не то время на сайте продажи авиабилетов. Или прислать смс-напоминание с ошибкой в приведении часовых зон. Это будет стоить колоссальных денег и нервов.

Я заметил, что откровенно плохо обстоит со временем у фронтендеров. Это связано с тем, что время – скорее серверная часть приложения, и к тому же требует некоторой подготовки и мышления. Чаще всего ошибки случались на стороне клиентской части.

Главное правило: никогда не пишите свой код для операций над временными зонами. Все современные библиотеки уже имеют этот функционал из коробки. Обертки над временными операциями должны быть минимальными. Если модуль разрастается без контроля, вы явно пишете говнокод. Остановитесь, пока весь проект не стал зависеть от кривых классов или функций.

Хорошей практикой будет избегать преобразований на местах внутри бизнес-логики. Лучше создать отдельный модуль и наполнять его вспомогательным кодом. Логично, что если где-то выяснится, что нужно было отнимать интервал, а не прибавлять, то исправить одну функцию будет проще, чем сканировать весь проект.

Для работы со временем лучше сразу брать хорошую стороннюю библиотеку. Время настолько сложная вещь, что редкий язык может похвастаться качественной коробочной реализацией. В Джаваскрипте объект Date убог. В Джаве класс java.util.Date был объявлен deprecated уже с версии 1.1, то есть почти сразу. Родной datetime в Питоне приемлем только для базовых задач.

Не нужно думать, что “мне только оберточку написать”, зато без зависимостей. Время – важно. Пусть будут зависимости, но меньше багов.

Рассмотрим основные положения о часовых поясах. Если оставить в стороне политические и географические причины, то в силу сферической природы мира разные люди могут наблюдать одно и то же положение Солнца на небосводе в разные моменты времени. Назовем это локальным временем. Последнее работает только в пределах того меридиана, дальше начинается неопределенность.

(Конечно, часовые пояса идут не идеально ровно как полоски на арбузе. Еще недавно в России меняли временные зоны – объединяли и делили соседние. Так, стараниями Медведева в моей родной Чите зимой в 16 часов было уже темно как ночью. Но для простоты будем считать, что пояса распределены равномерно.)

Поэтому фраза “созвонимся в три часа” в общемировом масштаба не значит ничего. По чьему времени в три часа? По Москве? Нью-Йорку? Очевидно, нужна особая метка чтобы обозначить, откуда это время получено. Тогда путем простых вычислений можно перевести время из одной метки в другую. Эта метка и называется временной зоной.

Обозначение у нее может быть разное, например смещение в часах (+03:00), имя части света и города через косую черту (Europe/Berlin) или одна из аббревиатур (CET, Центральное Европейское время), но это уже тонкости стандартов кадирования. Важно то, что теперь время привязано к конкретной местности и может быть преобразовано в универсальное время UTC.

UTC – универсальное координированное время – это современный стандарт отсчета, пришедший на смену GMT. Не будем сейчас разбирать его особенности, достаточно сказать, что на шкале поясов он играет роль нуля: именно от него отсчитываются отрицательные (западные) и положительные (восточные) зоны.

Например, я живу в Воронеже, мой пояс третий по счету на восток, поэтому я могу написать в резюме “when calling, please consider my +3 UTC timezone” или просто “my TZ is +3”. Тогда заказчик из Лондона, у которого нулевой пояс, добавит к своему времени 3 часа и получит мое локальное время.

Я подвожу вас к мысли, что в приложениях недостаточно знать только время, нужно знать еще и зону, иначе одно и то же время может быть истолковано по-разному. Так мы переходим к технической части статьи.

Ваш сервер и база данных отвечают за хранение дат. Современные БД (здесь и далее – PostgreSQL) предоставляют два типа полей: это timestamp with time zone и timestamp without time zone , то есть с зоной или без. Если в первое поле записать дату с зоной, то БД сконвертирует ее в UTC, потому что так удобней. А при выводе этой даты в утилитах она будет представлена в локальном времени того пользователя, кто сейчас ее просматривает.

Я создал таблицу с двумя полями: время с зоной и без. Потом записал в поле с временной зоной время с часовым поясом Нью-Йорка. В базе оно будет храниться как 2020-12-13 15:00:00 UTC . Но при выводе я увижу время в консоли в моем локальном времени. Все верно, мой пояс +3, дата была приведена верно.

А в поле ts нужно писать только время по UTC, иначе будет ошибка:

Видим, что во второе поле записалось не то, что нужно: правильное время по UTC должно быть 15 часов, а не 18. Вот как нужно было сделать:

Эта и другие ошибки будут рассмотрены ниже.

В различных библиотеках и ORM при выборке подобных дат они восстанавливаются в объекты языка с заполненной часовой зоной (поля tz, zone, tzinfo и тд).

Вариант дат без зон тоже имеет право на жизнь, и на мой взгляд он проще. В команде вы просто соглашаетесь, что все даты хранятся как локальное время по UTC. Все библиотеки имеют функции и методы для работы с таким временем, например, datetime.utcnow() в Питоне, moment.utc() в JS и тд.

Клиент и сервер должны обмениваться друг с другом только датами в UTC. Универсальное время переводится в локальное на стороне клиента исходя из локального смещения относительно нулевого меридиана. Эту величину можно определить методом .getTimezoneOffset() объекта Date на клиенте.

При передаче дат клиенту вы кодируете их в ISO-формат с зоной. Если зона UTC, она обозначается буквой Z. Таким образом, в текстовом представлении время, отправляемое клиенту будет выглядеть так:

Слева направо: год, месяц, день, разделитель, часы, минуты, секунды, микросекунды, индикатор нулевой зоны UTC.

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

На этом этапе нельзя не заметить, насколько убог формат JSON: он не может передавать даты и не расширяется.

В обратную сторону с клиента на сервер даты передаются в таком же формате: ISO-строка в UTC с Z на конце в качестве зоны.

Рассмотрим, что делать клиенту с полученной строкой. Легче всего восстановить ее в объект библиотекой moment.js:

Видим, что все правильно: мой пояс +3, часы были увеличены на эту разницу, на конце индикатор +03:00.

В сторону: сейчас кто-то встанет и начнет заливать, что moment.js уже не популярен, и что горячие парни пишут какую-то новую либу на замену ей. Мой совет – шлите лесом таких советчиков. Нам нужно проверенное решение, а не модная поделка.

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

Стоит запомнить: если показ даты требует от вас каких-то махинаций вроде прибавления или вычитания часов, минут или что-то в этом роде – срочно остановитесь, вы гарантированно что-то делаете неправильно. Или должно быть четкое понимание, почему нельзя сделать по-другому.

При передаче JSON-тела на сервер объект Date не нужно приводить в ISO-строку вручную. Для этого существует метод .toJSON() , который автоматически будет вызван при кодировании внешнего словаря. Например:

Илон Маск рекомендует:  Что такое код createdialogindirectparam

Рассмотрим основные ошибки, связанные с обработкой времени и как с ними бороться. Начнем с сервера.

  • Тип поля указан timestamp with time zone , но вы передаете объект времени без зоны.

В этом случае сервер подставит текущую зону, то есть ту, в которой расположен сервер. Если пользователь расположен далеко, например, на другом континенте, это может вызвать значительные неудобства. Скажем, пользователь из Нью-Йорка (-5 UTC) передал на сервер время «2020-12-12T14:20:00Z» . Сервер расположен в Швейцарии (+1 UTC). По какой-то причине зона была отброшена, и в базу вместо «2020-12-12T23:20:00 UTC» (исходное плюс 5 часов) записалось «2020-12-12T13:20:00 UTC» (исходное минус 1 час). Ошибка в 10 часов! Представьте, что это напоминания о поездке или рассылка смс.


  • Тип поля timestamp without time zone , но в базу пишется локальное время сервера.

Убедитесь, что для получения текущего времени вы используете функцию с utc в ее имени, например, datetime.utcnow() вместо datetime.now() и аналогично в других языках. В PostgreSQL аналогично: почти для всех вызовов временных функций нужно указывать зону UTC. Сравните:

Перевести зону из одной в другую на уровне БД можно следующим оператором:

Python 3 – Время. Метод localtime()

Описание

Синтаксис

Ниже приведен синтаксис метода localtime():

Параметры

sec – это количество секунд, которые нужно преобразовать в представление структуры struct_time.

Возвращаемое значение

Этот метод не возвращает никакого значения.

Пример

В следующем примере показано использование метода localtime().

Результат

Когда мы запускаем указанную выше программу, она дает следующий результат:

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Изменить часовой пояс Linux

Мы очень часто пользуемся временем в Linux, начиная от простой задачи узнать сколько сейчас времени, до более сложной — посмотреть логи или узнать когда произошло то или иное событие в системе. Все завязано на времени, поэтому очень важно, чтобы часы шли правильно.

Наша планета разделена на часовые пояса, это было сделано с одной простой целью, чтобы время в любой точке планеты соответствовало солнечному времени. Время между этими зонами отличается на час и всего таких поясов — 24, за эталон взято время по нулевому, Гринвичскому меридиану.

Поэтому в определенный момент время в разных участках планеты будет отличаться на час. В этой небольшой статье мы рассмотрим как изменить часовой пояс Linux, чтобы операционная система правильно работала со временем и могла правильно его синхронизировать через интернет.

Как работает время в Linux?

Операционная система Linux хранит и обрабатывает системное время в специальном Unix формате — количество секунд прошедших с полуночи первого января 1970 года. Эта дата считается началом эпохи Unix. И используется не ваше локальное время, а время по гринвичскому меридиану.

Для преобразования времени по Гринвичу в региональное время используется часовой пояс. Это преобразование выполняется для каждого пользователя. Это необходимо, чтобы каждый пользователь мог настроить для себя правильное по его временной зоне время. Такое поведение просто необходимо на серверах, когда на одной машине могут работать люди из разных частей мира.

По умолчанию в системе может быть установлен неправильный часовой пояс, это приведет к путанице в логах событий, да и другим трудностям. Но все это легко исправить. Дальше мы рассмотрим несколько способов изменить часовой пояс Linux.

Настройка часового пояса в /etc/localtime

Наиболее популярный и поддерживаемый в большинстве дистрибутивов способ установки часового пояса для всех пользователей — с помощью символической ссылки /etc/localtime на файл нужного часового пояса. Список доступных часовых поясов можно посмотреть командой:

Сначала создайте резервную копию текущего часового пояса:

cp /etc/localtime /etc/localtime.bak

Для создания символической ссылки используйте команду ln -sf. Файл зоны нужно выбрать из доступных в системе. Например, мой часовой пояс — Украина, Киев, для установки будет использоваться следующая команда:

ln -sf /usr/share/zoneinfo/Ukraine/Kyiv /etc/locatime

Теперь можете проверить текущее системное время с помощью утилиты date:

Если у вас установлена утилита rdate можно синхронизировать время с сетью:

/usr/bin/rdate -s time-a.nist.gov

Осталось только синхронизировать ваши аппаратные часы с новыми настройками, для этого выполните команду:

Если нужно изменить часовой пояс только для определенной программы или скрипта, просто измените для нее переменную окружения TZ, например:

Эта настройка сохраняется только для текущего сеанса командной оболочки. Чтобы сменить часовой пояс linux для определенного пользователя тоже нужно использовать переменную среды TZ. Только ее нужно добавить в файл


/.environment. Этот файл читается по умолчанию при входе в систему, а значит переменная будет доступна всем программам:

Готово, теперь вы знаете как выполняется настройка часового пояса linux для определенного пользователя.

Другие консольные утилиты

Если вы не хотите использовать описанный выше способ, можно воспользоваться специальными утилитами. Вот только в разных дистрибутивах используются свои утилиты. Рассмотрим варианты для самых популярных дистрибутивов.

В Red Hat Linux:

В CentOS и Fedora:

В Slackware или FreeBSD:

В большинстве случаев вы увидите подобное диалоговое окно:

Здесь просто нужно выбрать нужный часовой пояс и нажать кнопку Enter. После этого для окончательного применения настроек нужно будет перезагрузить систему.

Настройка часового пояса в GUI

В дистрибутиве Ubuntu и других, использующих Gnome, настройка часового пояса linux может быть выполнена прямо в параметрах системы. Для этого выберите пункт Дата и время, выберите свое местоположение на карте, или наберите название для поиска в поле ввода:

В KDE аналогично можно установить часовой пояс в настройках системы. Запустите утилиту настроек, откройте пункт Локализация, перейдите в раздел Дата и время, а затем откройте вкладку Часовой пояс:

Остается выбрать часовой пояс в списке и нажать кнопку Применить. Здесь уже изменения должны проявиться моментально.

Выводы

Теперь вы знаете как выполняется установка часового пояса в linux и сможете настроить не только свой домашний компьютер но и сервер с множеством пользователей, которым нужен отдельный часовой пояс для правильного местного времени. Если у вас остались вопросы, спрашивайте в комментариях!

На завершение видео, в котором подробно рассказано, что такое часовые пояса и зачем они нужны:

Как преобразовать местное время в UTC и UTC местного часового пояса?

Я хочу , чтобы хранить UTC время в БД ( yyyy-mm-dd или dd-mm-yyyy )

  1. Я хочу, чтобы преобразовать местное время в UTC и сохранить его в БД

Я пытался по-разному, но это не работает должным образом. Ниже мой код для новообращенного локального до UTC

  1. получить время UTC из базы данных и конвертировать в локальный часовой пояс

Ниже приведен код для обоих:

java.util.Date Не имеет никакой информации часового пояса . Он имеет только long значение, которое является числом миллисекунд с эпохи Unix (который является 1970-01-01T00:00:00Z или 1 января ул 1970 в полночь UTC ). Это значение (число миллисекунд с начала эпохи) имеет много имен , я просто называю это меткой времени для краткости.

Метка времени является «абсолютным» значение, это то же самое во всем мире.
Пример: Я только что получил текущее время ( System.currentTimeMillis() ) и результат был 1507722750315 (это текущее количество миллисекунд с начала эпохи). Это значение одинаково для всех в мире. Но это же значение может соответствовать к другой дате / времени в каждом часовом поясе:

  • в UTC, что соответствует 2020-10-11T11:52:30.315Z
  • в Сан-Паулу (Бразилия), это 2020-10-11T08:52:30.315-03:00
  • в Лондоне, это 2020-10-11T12:52:30.315+01:00
  • в Токио, это 2020-10-11T20:52:30.315+09:00
  • в Индии, это 2020-10-11T17:22:30.315+05:30
  • в Окленде, это 2020-10-12T00:52:30.315+13:00 (это уже «завтра» там)
  • и так далее.

Итак, когда вы делаете метод , который получает java.util.Date и пытается преобразовать его в другой java.util.Date , вы ничего не преобразование. Date Содержит только значение временной метки ( «абсолютное» значение , которое соответствует конкретному моменту времени). Но Date сам по себе ничего не знаю о часовых поясах не знает, так что бессмысленно делать такую Перекодировку (метка времени одинакова для всего мира, нет никакой необходимости , чтобы преобразовать его).

«Но когда я печатаю дату, я вижу значение в моем местное время»

Ну, это объясняется в этой статье . Если вы System.out.println в Date , или войти, или искать его значение в отладчике, вы увидите что — то вроде:

Ср 12 октября 12:33:99 IST 2020

Но это потому , что toString() метод быть неявно называется, и этот метод преобразует значение временной метки в часовой пояс JVM по умолчанию (так это выглядит , как «местный дата / время»).

Но помните, что эта Wed Oct etc строка не фактическое значение удержания на Date объекте: все это имеет, отметка времени , что соответствует этой дате / времени на дисплее. Но сама дата объект не имеет никакого представления о локальной дате / времени, ни какой — либо информации , относящейся к временной зоны. То , что вы видите , это просто представление значения временной метки, в определенном формате, для конкретной временной зоны.

Что же тогда делать?

Если поле базы данных является дата типа, то драйвер JDBC обычно обрабатывает его, так что вы просто сохранить Date объект непосредственно. Там нет необходимости заботиться о форматах и часовых поясах, так как Date не имеет формата, ни какая — либо информации часового пояса.


Проблема типов дат является то , что любой язык / базы данных / поставщик / приложение показывает его по-другому. В Java Date.toString() преобразует его в часовом поясе JVM по умолчанию, некоторые базы данных показывает в определенном формате (дд / мм / гггг или гггг-мм-дд, и т.д.) и преобразует в любой часовой пояс настраивается в БД, и так далее.

Но помните , что сама дата не имеет формата. Она имеет только значение, дело в том , что та же дата может быть представлена в различных форматах. Пример: 15 октября 2020 может быть представлена в виде 2020-10-15 , 10/15/2020 , 15th Oct 2020 , 15 de Outubro de 2020 (в pt_BR (португальский) языковой стандарт) и так далее. Формат ( представление ) отличается, но Date значение одно и то же.

Таким образом, если вы имеете дело с Date объектами, поле базы данных типа даты , связанными и оно возвращает и сохраняет Date объект, просто использовать его непосредственно.

Если вы хотите отобразить эту дату, хотя, (показать на пользователя, или зарегистрировать ее), или если поле базы данных является String (или VARCHAR, или любой другой текст , связанные с типом), то это совсем другое дело.

При печати даты (или преобразования его к String ), вы можете выбрать формат и часовой пояс вы преобразовывая в, используя SimpleDateFormat :

В этом случае, выход:

Если изменить часовой пояс на другой, то результат будет преобразован к нему:

Но Date значение по — прежнему тот же: если вы звоните date.getTime() , он будет возвращать значение временной метки, которая до сих пор 1507722750315 . Я только что изменил представление этой даты (формат и часовой пояс). Но Date сама по себе имеет его значение неизменным.

Также обратите внимание , что я использовал IANA имена часовых поясов (всегда в формате Region/City , как Asia/Kolkata и Europe/Berlin ). Избегайте использования 3 букв аббревиатуры (например , IST или CET ) , потому что они неоднозначны и не стандартны .

Илон Маск рекомендует:  Безопасное программирование

Вы можете получить список доступных часовых поясов (и выбрать тот , который подходит лучше вашей системе) по телефону TimeZone.getAvailableIDs() .

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

Для того, чтобы получить Date от А String , не используйте устаревший конструктор ( new Date(«09/10/2020 21:53:17») ). Это лучше использовать SimpleDateFormat и установить часовой пояс эта дата относится.

В тестах , которые я сделал, 09/10/2020 это интерпретируется как «месяц / день / год», поэтому я буду использовать то же самое. Я также принимая во внимание , что вход в UTC, но вы можете изменить его на любой часовой пояс вам нужно:

Дата выше будет эквивалентна 10 сентября — го 2020 года, в 21:53:17 в формате UTC . Если вход в другом часовом поясе, просто измените «UTC» соответствующим именем часового пояса.

Проверьте Javadoc для всех возможных форматов , используемых SimpleDateFormat .

Java новая Дата / время API

Старые классы ( Date , Calendar и SimpleDateFormat ) имеет множество проблем и вопросы проектирования , и они заменяются новым API.

Если вы используете Java 8 , рассмотрите возможность использования нового java.time API . Это проще, менее Bugged и менее подвержены ошибкам , чем старый API — интерфейсы .

Если вы используете Java 6 или 7 , вы можете использовать ThreeTen Backport , большой Backport для новых классов даты / времени Java 8 в. И для Android , вы также будете нуждаться в ThreeTenABP (подробнее о том , как использовать его здесь ).

Приведенный ниже код работает для обоих. Единственное различие в названиях пакетов (в Java 8, java.time и в ThreeTen Backport (или ThreeTenABP Андроида) является org.threeten.bp ), но классы и методы имена совпадают.

Новейшие драйверы JDBC уже имеют поддержку новых типов Java 8 (проверьте , если у вас уже есть). Но если вам все еще нужно использовать java.util.Date , вы можете легко конвертировать из / в новый API.

В Java 8, Date имеет новый from и toInstant методы, чтобы конвертировать из / в новый java.time.Instant класс:

В ThreeTen Backport, вы можете использовать org.threeten.bp.DateTimeUtils класс для преобразования из / в org.threeten.bp.Instant :

Имея Instant , вы можете легко конвертировать в любой часовой пояс вы хотите (используя ZoneId класс , чтобы преобразовать его к ZonedDateTime ), а затем с помощью DateTimeFormatter изменения формата:

Для разбора String аналогично. Вы использовать DateTimeFormatter , а затем разобрать к LocalDateTime (поскольку вход String не имеет часовой пояс в нем), то преобразовать его в часовом поясе (и при необходимости можно преобразовать её в , Date если вам нужно):

Системное время

Системное время использует системные часы и используется в Unix системах для слежения за временем. Его можно установить с помощью аппаратных часов или с помощью внешнего сервера времени.

Contents

Предисловие

Программные или аппаратные часы

Системные часы, предоставляемые ядром, реализуются простым подсчетом числа секунд, прошедших с 1 января 1970 года 00:00:00 UTC по настоящее время. Это число называется Unix-время.

Аппаратные часы, также известные как часы реального времени (real-time clock или RTC), обычно представляют из себя элемент материнской платы. Они работают все время, независимо от состояния операционной системы, даже когда компьютер выключен.

UTC или местное время

Настройка времени аппаратных часов может быть осуществлена исходя из двух стандартов: локальное время или время UTC. Локальное время — это реальное время часового пояса, учитывающее переход на DST. Предпочтительно использовать UTC, поскольку системное время вычисляется посредством прибавления к нему разницы времени часового пояса с учётом летнего времени. Благодаря этому перевод часов на летнее время учитывается автоматически, а изменение часового пояса возможно без изменения значения аппаратных часов. Исключение может быть сделано при использовании систем с двойной загрузкой, когда одна операционная система не поддерживает или не настроена для аппаратных часов с UTC (по умолчанию Windows настроена на использование локального времени).

Конфигурация

Часовой пояс


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

OpenRC

systemd

В systemd существует команда timedatectl для настройки часового пояса:

Проверка текущего часового пояса:

Вывод доступных часовых поясов:

Чтобы изменить часовой пояс, пример для Германии:

LC_TIME

Эта переменная окружения определяет форматирование даты и времени. Для более детальной информации смотрите The GNU C Library

Системные часы

Обычно время системных часов устанавливается аппаратными часами во время загрузки системы. Также системные часы возможно установить вручную либо с помощью сервера сетевого времени.

Для изменения системного времени можно воспользоваться командой date :

Вывод текущего времени программных часов:

Установка нового системного времени, например на 6 мая 2020 года в 12:34:

Сервер времени

Смотрите статью NTP, чтобы получить информацию по использованию сервера времени.

systemd

systemd существует команда timedatectl для управления системным временем:

Вывод текущего времени программных часов:

Установка системного времени:

Аппаратные часы

Чтобы получить доступ к аппаратным часам, нужно собрать ядро со следующими включенными параметрами:

Следующая команда выводит текущее на данный момент время аппаратных часов:

Следующая команда устанавливает время аппаратных часов в соответствии с системным временем:

Синхронизация аппаратных часов и системного времени

Обычно аппаратные часы используются при загрузке для установки системного времени. Это может быть осуществлено ядром самостоятельно, либо с помощью загрузочного сервиса init-скрипта при загрузке. Завершение работы ядра или сервиса также может вызвать сохранение времени системных часов в аппаратные часы. Благодаря этому у системы будет правильное время при следующей загрузке.

Синхронизация с помощью ядра

В свежих версиях (3.9 и выше) ядро Linux можно сконфигурировать таким образом, чтобы оно устанавливало системное время автоматически. Чтобы добиться этого, необходимо включить в ядре параметры Set system time from RTC on startup and resume ( CONFIG_RTC_HCTOSYS ) и Set the RTC time based on NTP synchronization ( CONFIG_RTC_SYSTOHC ):

Параметр ядра Set the RTC time based on NTP synchronization на данный момент поддерживается chrony [1] , NTP и OpenNTPD начиная с версии 5.9p1 [2] .

Чтобы убедиться, что время аппаратных часов обновилось, установите пакет net-misc/adjtimex и запустите следующую команду:

Выведенное число 64 бит должно быть не задано (0). Более подробная информация в man-странице hwclock (ищите ’11 minute mode’).

OpenRC

При использовании OpenRC для установки системного времени во время загрузки и синхронизации аппаратных часов во время завершения работы можно воспользоваться init-скриптом hwclock . Данная сервис включен по умолчанию и должен быть отключен при использовании вышеуказанного способа синхронизации ядром. Скрипт hwclock не следует запускать при использовании часов реального времени ядра.

Однако, если необходимо синхронизировать время с помощью OpenRC, в файле /etc/conf.d/hwclock для clock_hctosys и clock_systohc следует установить значение в YES . По умолчанию сервис настроена на стандарт UTC. Чтобы изменить это на использование стандарта местного времени (localtime) необходимо добавить clock=»local» .

Перезапустите сервис hwclock и добавьте его init-скрипт в уровень запуска boot:

systemd


Для установки системного времени во время загрузки можно использовать systemd. Для управления аппаратными часами используйте команду timedatectl :

Вывод текущего времени аппаратных часов:

Следующая команда устанавливает аппаратные часы в соответствии с системным временем (в стандарте времени UTC):

Следующая команда устанавливает аппаратные часы в соответствии с системным временем в стандарте времени localtime (местное время):

Устранение проблем

Двойная загрузка с Windows

Systems that dual boot with another operating system, such as Windows, generally have a struggle over the hardware clock. To make Windows not adjust the hardware clock back to local time, add the following registry entry.

For 64-bit Windows, open regedit then browse to HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation . Create a new QWORD entry called RealTimeIsUniversal , then set its value to 1 . Reboot the system. The clock should now be in UTC time.

Как правильно получить местное время, когда TZ = «: /etc/localtime»?

Моя переменная окружения TZ установлена в : /etc/localtime . Файл /etc/localtime является символической ссылкой на файл /usr/share/zoneinfo/America/Chicago . Пока я использую это, чтобы получить объект локального времени:

Потому что следующее дает мне время, установленное в UTC:

Предполагается ли, что стандартные библиотеки Crystal возвращают местоположение в формате UTC для TZ = «: /etc/localtime» или я предполагаю вручную установить TZ для часового пояса (например, «Америка/Чикаго»)?

Time::Location поддерживает только значения TZ которые являются путями относительно базы данных zoneinfo (например: America/Chicago ). В настоящее время он не может разрешить абсолютные пути. Это может быть добавлено как запрос функции, хотя.

Time.local дает вам время в UTC просто потому, что Time::Location.load_local не может понять значение ENV[«TZ»] и по умолчанию использует UTC. Если вы просто отключили TZ , он должен работать как положено.

Когда TZ не установлен, по умолчанию используется значение, указанное в /etc/localtime . Так что ваши пользовательские усилия не должны быть вообще необходимыми. В частности, Crystal::System::Time не должен вызываться непосредственно из кода пользователя.

Устанавливаем в системе Linux время, дату и часовой пояс из командной строки или из Gnome | Используем ntp

В системе Linux очень важно иметь правильное время и дату, поскольку от этого зависит многое. Причем неважно, используете ли вы систему Linux на своем персональном компьютере или у вас Linux-сервер. Серверные и системные часы должны указывать правильное время.

Аппаратные часы — это те часы, которые работают на вашем компьютере даже тогда, как питание компьютера отключено. Это возможно благодаря наличию в современных компьютерах литиевой батареи или батареи другого типа в более старых компьютерах.

Мы можем увидеть различие между аппаратными и системными часами

Вы увидите что-то вроде следующего:

Теперь проверьте системные часы

Вы увидите что-то вроде следующего:

Давайте установим аппаратные часы по местному времени:

Если вы хотите установить их на использование времени по Гринвичу (UTC):

Установка часового пояса

Чтобы в ваших системных часах установить часовой пояс, выполните следующее:

Правильно укажите ваш часовой пояс.

Автоматическая регулировка часов

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

Отредактируйте файл /etc/ntpd.conf . Он будет выглядеть следующим образом:

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

Для Arch Linux это: /etc/rc.d/ntpd start ; для Debian и производных систем: /etc/init.d/ntpd start

Обновление из командной строки времени по значению, получаемому с сервера времени

Вы можете обновлять время вручную без использования демона ntpdate

Вы получите что-то вроде следующего:

Бонус: Установка времени и даты в Gnome

Если вы используете Gnome, щелкните правой кнопкой мыши по изображению часов и выберите пункт настройки adjust, или в меню выберите пункт System > Administration > Time and Date (Система > Администрирование > Время и дата). Вам, возможно, будет предложено ввести пароль.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL