Преобразования между временем и датой
Алгоритм преобразования между двумя отметками времени, условно обозначенными как "модифицированная юлианская дата + всемирное координированное время (MJD + UTC)" и "местная" MJD + местное время", должен быть сведен к добавлению или вычитанию местного сдвига по времени.
Смещения времени положительны для долгот к востоку от Гринвича и отрицательны для долгот к западу от Гринвича.
Возможные варианты преобразования времени показаны на рисунке Д.1 [1].
Рисунок Д.1 - Направления преобразований времени между модифицированным юлианским календарем и Всемирным координированным временем
Пять возможных направлений преобразования времени, показанных на рисунке Д.1, могут быть выражены с помощью следующих математических выражений:
а) Найти Y, М, D из MJD
Y' = int [(MJD - 15 078,2) / 365,25]
М' = int {[MJD - 14 956,1 - int (Y' x 365,25)] / 30,6001}
D = MJD - 14 956 - int (Y'x 365,25) - int (M' x 30,6001)
If M'= 14 or M'= 15, then К =1;
else К = 0
Y = Y' + К
M = M' - 1 - K x 12
б) Найти MJD из Y, M, D
If M = 1 or M = 2, then L = 1;
else L = 0
MJD = 14956 + D + int [(Y - L) x 365,25] + int [ (M + 1 + L x 12) x 30,6001]
в) Найти WD из MJD
WD = [(MJD + 2) mod 7] + 1
г) Найти MJD из WY, WN, WD
MJD = 15012 + WD + 7 x {WN + int[(WYx 1461/28)+ 0,41]}
д) Найти WY, WN из MJD
W = int [(MJD / 7) - 2144,64]
WY = int [(W x 28 /1 461) - 0,0079]
WN = W - int [(WY x 1 461 /28) + 0,41],
где:
D | - день месяца (от 1 до 31); |
int | - целая часть (не учитывая остаток); |
K, L, M', W, Y' | - промежуточные переменные; |
M | - месяцы от января (М=1) до декабря (М=12); |
MJD | - модифицированная юлианская дата (календарь); |
mod 7 | - остаток (от 1 до 6) после деления по модулю 7; |
UTC | - Всемирное координированное время; |
WD | - день недели с понедельника (WD=1) по воскресенье (WD=7); |
WN | - номер недели в соответствии с ISO 8601; |
WY | - "номер недели", начиная с 1900 года; |
x | - знак умножения; |
Y | - год, начиная с 1900 (пример: Y=113 для 2013 года). |