Как найти системную дату

Статья обновлена: 13 июля 2022
ID: 3508

Оптимальная защита для Windows

Kaspersky for Windows защищает вашу цифровую жизнь, выходя за рамки обычного антивируса.

Ошибки в работе программ «Лаборатории Касперского» могут быть связаны с тем, что на компьютере неправильно установлено системое время, дата или часовой пояс. Чтобы это исправить:

  1. Проверьте и при необходимости измените часовой пояс.
  2. Синхронизируйте дату и время с сервером времени в интернете.

    Если после этого дата или время не совпадают с текущими, измените их вручную.

Подробные инструкции для Windows 11, 10, 8, 8.1, 7 и Vista смотрите ниже.

Windows 11, 10

Windows 8, 8.1

Windows Vista, 7

11 / 11 / 12

Регистрация: 06.05.2015

Сообщений: 421

1

Узнать системную дату

15.11.2015, 16:35. Показов 3843. Ответов 3


Студворк — интернет-сервис помощи студентам

Подскажите, как можно узнать системную дату…
При этом, её нужно узнать отдельно день, отдельно месяц, отдельно год…
Для дальнейшего занесения в тип int



0



Joker456

19 / 19 / 16

Регистрация: 13.10.2013

Сообщений: 205

15.11.2015, 18:32

2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <Windows.h>
#include <stdio.h>
#include <iostream>
#include <time.h>
 
void main()
{
    setlocale(LC_ALL, "Russian");
    SYSTEMTIME st;
    GetSystemTime(&st);
    printf("Год:%dnМесяц:%dnДень:%dn", st.wYear, st.wMonth, st.wDay);
 
    //Можно еще так
    time_t t;
    struct tm *tm;
    int day, month, year;
 
    t = time(NULL);
    tm = localtime(&t);
 
    day = tm->tm_mday;
    month = tm->tm_mon;
    year = tm->tm_year;
 
    printf("%d.%d.%d", day, ++month, (year % 100) + 2000);
 
}



0



Эксперт С++

4982 / 3089 / 456

Регистрация: 10.11.2010

Сообщений: 11,165

Записей в блоге: 10

15.11.2015, 18:42

3

В стандартной библиотеке C++ пока нет функций/классов/методов для получения системной даты.
Поможет либо сторонняя кроссплатформенная библиотека, либо стандартные средства ОС.
Какая ОС интересует?



0



599 / 237 / 69

Регистрация: 08.08.2015

Сообщений: 1,637

15.11.2015, 19:03

4

Rider98, смотри методы GetSystemTime GetLocalTime в WinAPI, если конечно вопрос про нее



0



Содержание

Введение
Узнать текущие системные дату и время (date)
Узнать текущие дату и время BIOS (hwclock)
Изменить дату и время вручную
Синхронизация с ntp
Заставить систему синхронизовать время с ntp
Похожие статьи

Введение

При работе в сети синхронизация времени и даты это важный
фактор увеличивающий стабильность и

безопасность

работы всех систем.

В этой статье вы узнаете как настраивать дату и время вручную. И, что более
важно – как синхронизировать их с ntp сервером.

Узнать текущее системное время

Узнать текущее системное время можно командой
date

date

2023-05-19 16:51:44.364911+02:00

Узнать текущее время BIOS

Узнать текущее системное время BIOS можно командой
hwclock

sudo hwclock

2023-05-19 16:51:44.389911+02:00

date и hwclock
могут показывать совершенно разное время

Исправить текущее время

Сначала нужно задать время командой
date

date MMDDhhmmCCYY.ss

Описание параметров команды date:

MM две цифры текущего месяца (пример: январь=01);

DD

две цифры текущей даты (если текущий календарный день 1, то пишется 01);

hh

две цифры обозначающие час

mm

две цифры обозначающие минуты

CCYY

четыре цифры года

ss

две цифры секунд

Также можно вводить «date MMDDhhmmCCYY»
без секунд, тогда секунды выставляются на ноль.

После выполнения date нужно внести новое установленное время в BIOS:

hwclock –systohc

Теперь осталось только проверить сохранились ли изменения

sudo hwclock

Синхронизация с ntp

Проверьте установлен ли ntp командой

which ntpd

/usr/sbin/ntpd

Если ntp не установлен выполните

sudo yum install ntp

Проверьте запускается ли ntpd автоматически командой

systemctl list-unit-files | grep ntpd.s

ntpd.service enabled

Если ntpd неактивен (disabled) выполните

systemctl start ntpd

systemctl enable ntpd

Проверить добавлен ли сервис ntp в зону public в firewall можно командой

sudo firewall-cmd –get-services | grep ntp

Если ещё не добавлен, то чтобы разрешить UDP траффик от ntp выполните

firewall-cmd –permanent –add-service=ntp

firewall-cmd –reload

success

success

Отредактируйте файл

ntp.conf

с настройками сервера

vi /etc/ntp.conf

server 0.fi.pool.ntp.org
server 1.fi.pool.ntp.org
server 2.fi.pool.ntp.org
server 3.fi.pool.ntp.org

Теперь нужно перезапустить ntpd

systemctl restart ntpd

Проверить откуда берётся время можно командой

ntpq -p

remote refid st t when poll reach delay offset jitter
==============================================================================
time.cloudflare 10.79.8.177 3 u 14 64 7 3.987 -0.366 0.016
37.228.129.2 193.66.253.94 2 u 16 64 7 5.301 -1.639 1.908
ivanova.ganneff 237.17.204.95 2 u 13 64 7 5.296 3.850 0.266
ntp23.kashra-se 192.168.100.15 2 u 12 64 5 32.935 -2.213 0.192

Выставить время BIOS по только что полученному времени можно командой

hwclock –systohc

Заставить систему синхронизовать время с ntp

Можно следующей командой

ntpdate -u 0.fi.pool.ntp.org

Вместо 0.fi.pool.ntp.org поставьте нужный вам сервер

Похожие статьи

Linux
FAQ
Debian
Ubuntu
CentOS
Rocky
Bash
Настройка сети
Файлы, директории, ссылки…
Изучить свободное место на диске
Объединить .pdf файлы
diff: сравнение файлов
find: поиск файлов
wget: скачивание файлов
kill: завершить процесс
curl
make
signal: системные сигналы
env: переменные окружения
localectl: язык
systemctl: Список активных сервисов
Firewall
SCP: обмен файлами;
SSH: удалённый доступ
cron: задания по расписанию
sudo
Мониторинг ресурсов
C
C++

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

Если вы ищете инструмент, который позволяет делать все это (и многое другое), вы будете рады узнать, что существует команда date. В этой статье мы обсудим основные команды «date», а также, как вы можете использовать ее. Но прежде чем мы это сделаем, стоит отметить, что все команды и инструкции, упомянутые здесь, были протестированы на Ubuntu 16,04 LTS.

Вот общий синтаксис команды date:

date [OPTION]... [+FORMAT]

А вот что говорит страница man об этом:

date - вывод или установка даты и время системы 

Отображение текущего времени в данном формате, или установка системной даты.

Следующие примеры должны дать вам хорошее представление о том, как эта команда работает.

Q1. Как получить системную дату/время с помощью команды date?

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

date

Вот команда в действии:

date
Sun Jul  9 19:41:10 MSK 2017

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

Q2. Как получить дату, соответствующую дню?

Чаще всего, мы смотрим на календари, чтобы знать дату в определенный день недели. Например, требование может быть такое, узнать дату «когда следующий вторник». Вы будете рады узнать, что это возможно с помощью команды «date».

-d или —date параметр командной строки будет помощью в этом случае:

date -d "next Tuesday"

Вот вышеприведенная команда в действии:

date -d "next Tuesday"
Tue Jul 11 00:00:00 MSK 2017

Итак, как вы можете видеть, команда показала, что следующий вторник 4 июля.

Входной параметр -d/—date может быть разных типов. Вот как man описывает эту команду:

--date = строка в основном свободный формат удобочитаемой строки даты, такие как 
«Sun, 09 Feb 2017 19:21:20 -1905» или «2017-02-09 19:21:20» или даже «в следующий четверг»,  

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

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

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

info date

Q3. Как отображать информацию о дате/времени в формате ISO 8601?

В случае, если вы хотите, инструмент для отображения информации о дате/времени в формате ISO 8601, вы можете использовать параметр —iso-8601 командной строки. Эта опция требует, указать формат.

--iso-8601[=FMT]

Вот как страница man объясняет «format»:

FMT='date' только для даты (по умолчанию), 'hours', 'minutes', 'seconds', или 'ns' для даты и времени с 
указанной точностью. Пример: 2017-07-09T19:20:30-0600

Например, мы тестировали следующую команду:

date --iso-8601=seconds

На выходе было произведено:

2017-07-09T19:48:20+03:00

Q4. Как отображать дату/время в формате RFC 3339?

Как вы уже догадались, есть специальный параметр командной строки для этого: —rfc-3339. Как вариант, рассмотренный в предыдущем разделе, один также требует ввести формат.

Следующий пример показывает эту опцию в действии:

date --rfc-3339=seconds
2017-07-09 19:49:58+03:00

Кроме того, вы можете использовать —rfc-2822 для возможности выводить данные в этом формате.

Q5. Как использовать дату для отображения времени последнего изменения файла?

Вы можете также использовать команду date, чтобы отобразить время последнего изменения файла. Опция -r позволяет сделать это. Вот пример:

date -r file1

Вывод:

date -r file1
Tue Jul 09 19:53:10 MSK 2017

Q6. Как установить системную дату/время, используя команду date?

Для установки системной даты/времени на другое значение, используйте параметр -s командной строки. Эта опция требует строку, которая будет использоваться в качестве входных данных для установки системной времени/даты.

date -s STRING

Примечание:

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

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

date -s "2017-06-27 14:53:00"

Пожалуйста, обратите внимание, что вам, возможно, придется использовать «sudo» для опции -s.

Q7. Как отобразить текущее время в другом месте?

Для того, чтобы команда date отображала текущее время в другом месте — скажем, Мельбурн в Австралии — использовать ее надо следующим образом:

TZ="Australia/Melbourne" date

Вот вышеприведенная команда в действии:

TZ="Australia/Melbourne" date
Mon Jul 10 02:59:50 AEST 2017

Примечание:

Вы можете использовать команду «tzselect», чтобы найти значение, которое нужно для TZ.

Q8. Как распечатать или установить всеобщее Скоординированное время (UTC)?

Для этого используйте параметр -u командной строки. Например, следующая команда будет отображать информацию в формате UTC:

date -u
# date -u
Sun Jul  9 16:32:28 UTC 2017

Вывод

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

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

 

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

Типы, определенные в библиотеке time.h

Тип Описание
size_t Целочисленный тип, возвращаемый операцией sizeof.
clock_t Арифметический тип, подходящий для представления времени.
time_t Арифметический тип, подходящий для представления времени.
struct tm Структурный тип, содержащий компоненты календарного времени.

Для определения текущего календарного времени используется функция

Данная функция возвращает время в секундах начиная с 1 января 1970 г.

Например,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
char * settime(struct tm *u)
{
  char s[40];
  char *tmp;
  for (int i = 0; i<40; i++) s[i] = 0;
  int length = strftime(s, 40, “%d.%m.%Y %H:%M:%S, %A”, u);
  tmp = (char*)malloc(sizeof(s));
  strcpy(tmp, s);
  return(tmp);
}
int main() 
{
  struct tm *u;
  char *f;
  system(“chcp 1251”);
  system(“cls”);
  const time_t timer = time(NULL);
  u = localtime(&timer);
  f = settime(u);
  printf(“%ld соответствует “, timer);
  puts(f);
  getchar();
  return 0;
}

Дата и время

Структура tm имеет вид

struct tm
{
  int tm_sec;     // секунды после минут [0,59]
  int tm_min;     // минуты после часов [0,59]
  int tm_hour;    // часы после полуночи [0,23]
  int tm_mday;    // день месяца [1,31]
  int tm_mon;     // месяц года (январь = 0) [0,11]
  int tm_year;    // год (1900 год = 0)
  int tm_wday;    // день недели (вс = 0) [0,6]
  int tm_yday;    // день года (1 января = 0) [0,365]
  int tm_isdst;   // флаг перехода на летнее время (>0- вкл.)
};

Функция

struct tm *localtime(const time_t *ptm);

преобразует календарное время, указанное ptm, сохраняет его в структуре tm и возвращает указатель на нее.

Функция

time_t mktime(struct tm *timeptr);

осуществляет обратное преобразование.

Функция

возвращает наилучшее приближение процессорного времени, прошедшего с момента запуска программы; для получения времени в секундах значение необходимо разделить на константу, определенную в библиотеке time.h:

#define CLOCKS_PER_SEC 1000

Если время не доступно или не может быть представлено, возвращает (clock_t) (-1).

Функция

size_t strftime(
char *restrict s, // указатель на выходную строку
size_t max,    // максимальный размер выходной строки
const char *restrict fmt, // указатель на строку формата
const struct tm *restrict tmpt); // указатель на структуру tm

копирует строку fmt в строку s, заменяя спецификаторы формата в fmt соответствующими данными, взятыми из содержимого структуры времени, на которое указывает tmpt; в строку s помещается не более max символов.

Функция возвращает количество символов (исключая нулевой) в результирующей строке. Если результирующая строка (включая нулевой символ) содержит больше, чем max символов, функция возвращает 0, а содержимое s не определено.

Спец. Назначение
%a Локальное сокращенное название дня недели
%A Локальное полное название дня недели
%b Локальное сокращенное название месяца
%B Локальное полное название месяца
%c Локальный разделитель даты и времени
%d День месяца в виде десятичного числа (01-31)
%D Эквивалент %m%d%y
%e День месяца (десятичное число): однозначные числа дополнены пробелом
%F Эквивалент %Y-%m-%d
%g Последние два разряда года (00-99)
%G Год в виде десятичного числа
%H Часы (по 24-часовой шкале) в виде десятичного числа (00-23)
%I Часы (по 12-часовой шкале) в виде десятичного числа (01-12)
%j День года в виде десятичного числа (001-366)
%m Месяц в виде десятичного числа (01-12)
%n Символ новой строки
%M Минуты в виде десятичного числа (00-59)
%p Локальный эквивалент a.m./p.m. для 12-часовой временной шкалы
%r Локальное 12-часовое время
%R Эквивалент %H:%M
%S Секунды в виде десятичного числа (00-61)
%t Символ горизонтальной табуляции
%T Эквивалент %H:%M:%S
%u Номер дня недели (1-7), где 1 соответствует понедельнику
%U Номер недели в году, считая воскресенье первым днем недели (00-53)
%w Номер дня недели в виде десятичного числа, начиная с воскресенья (0-6)
%W Номер недели в году, считая понедельник первым днем недели (00-53)
%y Год без века в виде десятичного числа (00-99)
%Y Год с веком в виде десятичного числа
%z Смещение от UTC (“-800” означает на 8 ч по Гринвичу западнее).
%Z Наименование часового пояса (если доступно)
%% % (то есть знак процента).

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
char * settime(struct tm *u)
{
  char s[40];
  char *tmp;
  for (int i = 0; i<40; i++) s[i] = 0;
  int length = strftime(s, 40, “%d.%m.%Y %H:%M:%S “, u);
  switch (u->tm_wday)
  {
    case 0: strcpy(s + length, ” воскресенье”); break;
    case 1: strcpy(s + length, ” понедельник”); break;
    case 2: strcpy(s + length, ” вторник”);     break;
    case 3: strcpy(s + length, ” среда”);       break;
    case 4: strcpy(s + length, ” четверг”);     break;
    case 5: strcpy(s + length, ” пятница”);     break;
    case 6: strcpy(s + length, ” суббота”);     break;
  }
  tmp = (char*)malloc(sizeof(s));
  strcpy(tmp, s);
  return(tmp);
}
int main()
{
  struct tm *u;
  char *f;
  system(“chcp 1251”);
  system(“cls”);
  const time_t timer = time(NULL);
  u = localtime(&timer);
  f = settime(u);
  printf(“%ld соответствует “, timer);
  puts(f);
  getchar();
  return 0;
}

Результат выполнения
Дата и время

Добавление нескольких дней к текущему времени

Рассмотрим еще один пример. Допустим, требуется добавить несколько дней к текущей дате.
Реализация на Си

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#define ADD_DAYS 300
int main()
{
  struct tm *u;
  char s1[40] = { 0 }, s2[40] = { 0 };
  const time_t timer = time(NULL);
  u = localtime(&timer);
  strftime(s1, 80, “%d.%m.%Y %H:%M:%S “, u);
  printf(“%sn”, s1);
  u->tm_mday += ADD_DAYS;
  time_t next = mktime(u);
  u = localtime(&next);
  strftime(s2, 80, “%d.%m.%Y %H:%M:%S “, u);
  printf(“%sn”, s2);
  getchar();
  return 0;
}

Результат выполнения
Добавление нескольких дней к текущей дате

Реализация функции задержки

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#include <stdio.h>
#include <time.h>
void delay(int ms) // аргумент- требуемое время задержки в миллисекундах
{
  int c = clock() + ms;
  while (clock() < c);
}
int main() 
{
  printf(“clock = %dn”, clock());
  delay(1000);
  printf(“clock = %dn”, clock());
  getchar();
  return 0;
}

Результат выполнения
Функция задержки

Назад: Язык Си

Добавить комментарий