Пространство имён страницы (page_namespace ) | 0 |
Название страницы (без пространства имён) (page_title ) | 'UNIX-время' |
Полное название страницы (page_prefixedtitle ) | 'UNIX-время' |
Последние десять редакторов страницы (page_recent_contributors ) | [
0 => '145.255.6.206',
1 => '178.172.232.203',
2 => '176.212.49.186',
3 => 'ASDFS',
4 => '91.216.173.29',
5 => 'SergV',
6 => '95.221.221.198',
7 => '46.211.128.120',
8 => '94.181.46.58',
9 => '46.211.127.239'
] |
Вики-текст старой страницы до правки (old_wikitext ) | '{{эта статья|о формате кодирования времени|time (Unix)|об утилите}}
'''UNIX-время''' ({{lang-en|Unix time}}) или '''POSIX-время''' — система описания моментов во времени, принятая в [[UNIX]] и других [[POSIX]]-совместимых [[операционная система|операционных системах]]. Определяется как количество секунд, прошедших с [[полночь|полуночи]] (00:00:00 [[Всемирное координированное время|UTC]]) [[1 января]] [[1970 год]]а (четверг); время с этого момента называют «эрой UNIX» ({{lang-en|Unix Epoch}}).
Время UNIX согласуется с UTC — в частности, при объявлении [[секунда координации|високосных секунд]] UTC соответствующие номера секунд повторяются, то есть високосные секунды не учитываются.
Представление времени в виде количества секунд удобно использовать для сравнения и хранения дат (дата и время в этом формате занимают всего 4 или 8 [[октет (информатика)|байтов]]). При необходимости обращения к элементам дат (день, месяц, год) секунды можно преобразовать в любой подходящий формат (и наоборот), но если такие преобразования выполняются часто, они снижают производительность.
В программах для хранения UNIX-времени используется [[Целое (тип данных)#Целые со знаком|целочисленный знаковый тип]]. Знаковость упрощает вычисление разницы в секундах между двумя моментами времени, которая может быть отрицательной. 32-битные числа со знаком могут ссылаться на моменты времени от пятницы 13 декабря 1901 года 20:45:52 до вторника 19 января 2038 года 03:14:07 включительно.
Чтобы узнать текущее UNIX-время в большинстве UNIX-подобных систем, можно использовать команду <code>[[date]] +%s</code>.
== «Юбилейные» значения ==
<!-- Проверено User:ASDFS 22.06.2014 -->
{| class="wikitable"
! Время || Количество секунд
|-
|align="right"| [[13 декабря]] [[1901 год]]а, 20:45:52 [[UTC]] ||
Минимальная дата в знаковом 32-бит представлении (0x80000000)
|-
|align="right"| [[19 января]] [[2038 год]]а, 03:14:07 [[UTC]] ||
Максимальная дата в знаковом 32-бит представлении (0x7FFFFFFF)
|-
|align="right"| [[9 сентября]] [[2001 год]]а, 01:46:40 [[UTC]] ||
[[Миллиард|1 000 000 000]] (1 [[гига]]секунда)
|-
|align="right"| [[10 января]] [[2004 год]]а, 13:37:04 [[UTC]] ||
[[1 073 741 824 (число)|1 073 741 824]]=2<sup>30</sup> (1 [[гиби]]секунда)
|-
|align="right"| [[18 марта]] [[2005 год]]а, 01:58:31 [[UTC]] ||
[[1 111 111 111 (число)|1 111 111 111]]
|-
|align="right" | [[6 сентября]] [[2008 год]]а 12:12:05 [[UTС]] ||
[[1 220 703 125 (число)|1 220 703 125]] = 5<sup>13</sup>
|-
|align="right"| [[13 февраля]] [[2009 год]]а, 23:31:30 [[UTC]] ||
[[1 234 567 890 (число)|1 234 567 890]]
|-
|align="right"| [[24 октября]] [[2014 год]]а, 09:03:34 [[UTC]] ||
[[1 414 141 414 (число)|14 14 14 14 14]]
|}
== Проблема 2038 ==
{{main|Проблема 2038 года}}
[[19 января]] [[2038 год]]а в 03:14:08 по всемирному времени значение [[переменная (программирование)|переменной]] типа <code>time_t</code>, отсчитывающей число [[секунда|секунд]], прошедших с [[1 января]] [[1970 год]]а, достигнет 2<sup>31</sup>, что может привести к ошибочной интерпретации этого числа как [[Дополнительный код (представление числа)|отрицательного]]. Возможное решение данной проблемы состоит в использовании для хранения времени не 32-[[бит]]ной, а 64-битной переменной (что и делается во всех современных 64-битных операционных системах), этого хватит на 292 млрд лет.
== Программная конвертация ==
Приводится пример реализации на языке [[Си (язык программирования)|Си]] функций конвертации между UNIX-временем и обычным представлением в виде даты и времени суток. Пример приведен в стандартном знаковом 32-бит формате. Однако, закомментировав определение _XT_SIGNED, пример соберется в беззнаковом варианте.
<!-- Проверено User:ASDFS 22.06.2014 -->
{{Hider hiding|title=Конвертация времени, заголовочный файл|content= <source lang="c">
typedef unsigned short u16_t;
typedef unsigned long u32_t;
typedef signed short s16_t;
typedef signed long s32_t;
// DEF: standard signed format
// UNDEF: non-standard unsigned format
#define _XT_SIGNED
#ifdef _XT_SIGNED
typedef s32_t xtime_t;
#else
typedef u32_t xtime_t;
#endif
struct tm
{ /* date and time components */
BYTE tm_sec;
BYTE tm_min;
BYTE tm_hour;
BYTE tm_mday;
BYTE tm_mon;
u16_t tm_year;
};
void xttotm(struct tm *t, xtime_t secs);
xtime_t xtmtot(struct tm *t);
</source>}}
{{Hider hiding|title=Конвертация времени|content= <source lang="c">
#include "xtime.h"
#define _TBIAS_DAYS ((70 * (u32_t)365) + 17)
#define _TBIAS_SECS (_TBIAS_DAYS * (xtime_t)86400)
#define _TBIAS_YEAR 1900
#define MONTAB(year) ((((year) & 03) || ((year) == 0)) ? mos : lmos)
const s16_t lmos[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
const s16_t mos[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
#define Daysto32(year, mon) (((year - 1) / 4) + MONTAB(year)[mon])
/////////////////////////////////////////////////////////////////////
xtime_t xtmtot(struct tm *t)
{ /* convert time structure to scalar time */
s32_t days;
xtime_t secs;
s32_t mon, year;
/* Calculate number of days. */
mon = t->tm_mon - 1;
year = t->tm_year - _TBIAS_YEAR;
days = Daysto32(year, mon) - 1;
days += 365 * year;
days += t->tm_mday;
days -= _TBIAS_DAYS;
/* Calculate number of seconds. */
secs = 3600 * t->tm_hour;
secs += 60 * t->tm_min;
secs += t->tm_sec;
secs += (days * (xtime_t)86400);
return (secs);
}
/////////////////////////////////////////////////////////////////////
void xttotm(struct tm *t, xtime_t secsarg)
{
u32_t secs;
s32_t days;
s32_t mon;
s32_t year;
s32_t i;
const s16_t* pm;
#ifdef _XT_SIGNED
if (secsarg >= 0) {
secs = (u32_t)secsarg;
days = _TBIAS_DAYS;
} else {
secs = (u32_t)secsarg + _TBIAS_SECS;
days = 0;
}
#else
secs = secsarg;
days = _TBIAS_DAYS;
#endif
/* days, hour, min, sec */
days += secs / 86400; secs = secs % 86400;
t->tm_hour = secs / 3600; secs %= 3600;
t->tm_min = secs / 60; t->tm_sec = secs % 60;
/* determine year */
for (year = days / 365; days < (i = Daysto32(year, 0) + 365*year); ) { --year; }
days -= i;
t->tm_year = year + _TBIAS_YEAR;
/* determine month */
pm = MONTAB(year);
for (mon = 12; days < pm[--mon]; );
t->tm_mon = mon + 1;
t->tm_mday = days - pm[mon] + 1;
}
</source>}}
{{Hider hiding|title=Конвертация времени из формата Excel в Unix|content= <source lang="c">
double et; // дата и время в формате Excel (также используется в OpenOffice, Sierra Chart)
time_t ut = round( ( et * 86400 ) - 2209161600 ); // дата и время в формате Unix
</source>}}
== См. также ==
* [[Timestamp]]
{{нет источников|дата=2012-01-19}}
{{Внешние ссылки нежелательны}}
== Ссылки ==
* [http://unixtime.info Конвертер UNIX-времени]
[[Категория:Календарь]]
[[Категория:UNIX]]' |
Вики-текст новой страницы после правки (new_wikitext ) | '{{эта статья|о формате кодирования времени|time (Unix)|об утилите}}
'''UNIX-время''' ({{lang-en|Unix time}}) или '''POSIX-время''' — система описания моментов во времени, принятая в [[UNIX]] и других [[POSIX]]-совместимых [[операционная система|операционных системах]]. Определяется как количество секунд, прошедших с [[полночь|полуночи]] (00:00:00 [[Всемирное координированное время|UTC]]) [[1 января]] [[1970 год]]а (четверг); время с этого момента называют «эрой UNIX» ({{lang-en|Unix Epoch}}).
Время UNIX согласуется с UTC — в частности, при объявлении [[секунда координации|високосных секунд]] UTC соответствующие номера секунд повторяются, то есть високосные секунды не учитываются.
Представление времени в виде количества секунд удобно использовать для сравнения и хранения дат (дата и время в этом формате занимают всего 4 или 8 [[октет (информатика)|байтов]]). При необходимости обращения к элементам дат (день, месяц, год) секунды можно преобразовать в любой подходящий формат (и наоборот), но если такие преобразования выполняются часто, они снижают производительность.
В программах для хранения UNIX-времени используется [[Целое (тип данных)#Целые со знаком|целочисленный знаковый тип]]. Знаковость упрощает вычисление разницы в секундах между двумя моментами времени, которая может быть отрицательной. 32-битные числа со знаком могут ссылаться на моменты времени от пятницы 13 декабря 1901 года 20:45:52 до вторника 19 января 2038 года 03:14:07 включительно.
Чтобы узнать текущее UNIX-время в большинстве UNIX-подобных систем, можно использовать команду <code>[[date]] +%s</code>.
== «Юбилейные» значения ==
<!-- Проверено User:ASDFS 22.06.2014 -->
{| class="wikitable"
! Время || Количество секунд
|-
|align="right"| [[13 декабря]] [[1901 год]]а, 20:45:52 [[UTC]] ||
Минимальная дата в знаковом 32-бит представлении (0x80000000)
|-
|align="right"| [[19 января]] [[2038 год]]а, 03:14:07 [[UTC]] ||
Максимальная дата в знаковом 32-бит представлении (0x7FFFFFFF)
|-
|align="right"| [[9 сентября]] [[2001 год]]а, 01:46:40 [[UTC]] ||
[[Миллиард|1 000 000 000]] (1 [[гига]]секунда)
|-
|align="right"| [[10 января]] [[2004 год]]а, 13:37:04 [[UTC]] ||
[[1 073 741 824 (число)|1 073 741 824]]=2<sup>30</sup> (1 [[гиби]]секунда)
|-
|align="right"| [[18 марта]] [[2005 год]]а, 01:58:31 [[UTC]] ||
[[1 111 111 111 (число)|1 111 111 111]]
|-
|align="right" | [[6 сентября]] [[2008 год]]а 12:12:05 [[UTС]] ||
[[1 220 703 125 (число)|1 220 703 125]] = 5<sup>13</sup>
|-
|align="right"| [[13 февраля]] [[2009 год]]а, 23:31:30 [[UTC]] ||
[[1 234 567 890 (число)|1 234 567 890]]
|-
|align="right"| [[24 октября]] [[2014 год]]а, 09:03:34 [[UTC]] ||
[[1 414 141 414 (число)|14 14 14 14 14]]
|}
== Проблема 2038 ==
{{main|Проблема 2038 года}}
[[19 января]] [[2038 год]]а в 03:14:08 по всемирному времени значение [[переменная (программирование)|переменной]] типа <code>time_t</code>, отсчитывающей число [[секунда|секунд]], прошедших с [[1 января]] [[1970 год]]а, достигнет 2<sup>31</sup>, что может привести к ошибочной интерпретации этого числа как [[Дополнительный код (представление числа)|отрицательного]]. Возможное решение данной проблемы состоит в использовании для хранения времени не 32-[[бит]]ной, а 64-битной переменной (что и делается во всех современных 64-битных операционных системах), этого хватит на 292 млрд лет.
== Программная конвертация ==
Приводится пример реализации на языке [[Си (язык программирования)|Си]] функций конвертации между UNIX-временем и обычным представлением в виде даты и времени суток. Пример приведен в стандартном знаковом 32-бит формате. Однако, закомментировав определение _XT_SIGNED, пример соберется в беззнаковом варианте.
<!-- Проверено User:ASDFS 22.06.2014 -->
{{Hider hiding|title=Конвертация времени, заголовочный файл|content= <source lang="c">
typedef unsigned short u16_t;
typedef unsigned long u32_t;
typedef signed short s16_t;
typedef signed long s32_t;
// DEF: standard signed format
// UNDEF: non-standard unsigned format
#define _XT_SIGNED
#ifdef _XT_SIGNED
typedef s32_t xtime_t;
#else
typedef u32_t xtime_t;
#endif
struct tm
{ /* date and time components */
BYTE tm_sec;
BYTE tm_min;
BYTE tm_hour;
BYTE tm_mday;
BYTE tm_mon;
u16_t tm_year;
};
void xttotm(struct tm *t, xtime_t secs);
xtime_t xtmtot(struct tm *t);
</source>}}
{{Hider hiding|title=Конвертация времени|content= <source lang="c">
#include "xtime.h"
#define _TBIAS_DAYS ((70 * (u32_t)365) + 17)
#define _TBIAS_SECS (_TBIAS_DAYS * (xtime_t)86400)
#define _TBIAS_YEAR 1900
#define MONTAB(year) ((((year) & 03) || ((year) == 0)) ? mos : lmos)
const s16_t lmos[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
const s16_t mos[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
#define Daysto32(year, mon) (((year - 1) / 4) + MONTAB(year)[mon])
/////////////////////////////////////////////////////////////////////
xtime_t xtmtot(struct tm *t)
{ /* convert time structure to scalar time */
s32_t days;
xtime_t secs;
s32_t mon, year;
/* Calculate number of days. */
mon = t->tm_mon - 1;
year = t->tm_year - _TBIAS_YEAR;
days = Daysto32(year, mon) - 1;
days += 365 * year;
days += t->tm_mday;
days -= _TBIAS_DAYS;
/* Calculate number of seconds. */
secs = 3600 * t->tm_hour;
secs += 60 * t->tm_min;
secs += t->tm_sec;
secs += (days * (xtime_t)86400);
return (secs);
}
/////////////////////////////////////////////////////////////////////
void xttotm(struct tm *t, xtime_t secsarg)
{
u32_t secs;
s32_t days;
s32_t mon;
s32_t year;
s32_t i;
const s16_t* pm;
#ifdef _XT_SIGNED
if (secsarg >= 0) {
secs = (u32_t)secsarg;
days = _TBIAS_DAYS;
} else {
secs = (u32_t)secsarg + _TBIAS_SECS;
days = 0;
}
#else
secs = secsarg;
days = _TBIAS_DAYS;
#endif
/* days, hour, min, sec */
days += secs / 86400; secs = secs % 86400;
t->tm_hour = secs / 3600; secs %= 3600;
t->tm_min = secs / 60; t->tm_sec = secs % 60;
/* determine year */
for (year = days / 365; days < (i = Daysto32(year, 0) + 365*year); ) { --year; }
days -= i;
t->tm_year = year + _TBIAS_YEAR;
/* determine month */
pm = MONTAB(year);
for (mon = 12; days < pm[--mon]; );
t->tm_mon = mon + 1;
t->tm_mday = days - pm[mon] + 1;
}
</source>}}
{{Hider hiding|title=Конвертация времени из формата Excel в Unix|content= <source lang="c">
double et; // дата и время в формате Excel (также используется в OpenOffice, Sierra Chart)
time_t ut = round( ( et * 86400 ) - 2209161600 ); // дата и время в формате Unix
</source>}}
== См. также ==
* [[Timestamp]]
{{нет источников|дата=2012-01-19}}
{{Внешние ссылки нежелательны}}
== Ссылки ==
* [http://unixtime.info Конвертер UNIX-времени]
* [http://www.unixtime.it/ru/ Конвертер Unix time многоязычный]
[[Категория:Календарь]]
[[Категория:UNIX]]' |