конвертировать из номера недели GPS, времени недели в дату и время

У меня есть устройство GPS, которое отправляет некоторые объекты, включая время GPS, на мой сервер.
Оно приходит в формате номера недели, секунд в неделе.

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

Я нашел эту веб-страницу, которая делает это, но я не могу понять, как это сделать в коде приложения Windows С#.

Пример данных:

GPS Week number 1643
GPS second into week 377505

Это должно быть 2011/07/07 10:51:44.


person Ramah    schedule 07.07.2011    source источник
comment
Упомянутый преобразователь кажется подозрительным. Например, 0,60 и 0,61 оба дают 1980/01/06 00:01:00, но первая дополнительная секунда после эпохи GPS была только в 1981/07/01.   -  person jjlin    schedule 14.02.2012
comment
Конвертер просто преобразует время GPS в TOW/WeekNo. Ему наплевать на високосные секунды. Названия столбцов неверны.   -  person TJJ    schedule 17.05.2019


Ответы (2)


Если вы знаете DateTime, представляющий неделю, просто вызовите AddSeconds, чтобы найти нужное значение DateTime.

Согласно калькулятору, на который вы ссылались выше, неделя 1643, 377505 должна равняться 07.07.2011 07:51:44, а не 10:51:44 (может быть, это смещение часового пояса?). В любом случае, следующий фрагмент даст вы получаете тот же результат, что и калькулятор в ссылке, когда выбрано время по Гринвичу - для разных часовых поясов вам придется применять свои собственные смещения.

DateTime GetFromGps(int weeknumber, double seconds)
{
    DateTime datum = new DateTime(1980,1,6,0,0,0);
    DateTime week = datum.AddDays(weeknumber * 7);
    DateTime time = week.AddSeconds(seconds);
    return time;
}
person ZombieSheep    schedule 07.07.2011
comment
да. я нашел ошибку в моем коде.. это было начиная с 1980.1.1 - person Ramah; 07.07.2011
comment
Не поправка как таковая, а примечание на будущее: сигнал времени от спутников GPS не включает високосные секунды., что означает, что ваше время по этому расчету будет на несколько секунд отличаться от стандартного UTC. Сейчас это число составляет 16 секунд, но в июне 2015 года оно будет 17 секунд. - person Phlucious; 07.04.2015
comment
почему время начинается с (1980, 1, 6) ?? @Phlucious: так что я должен просто добавить високосные секунды к этим результатам, чтобы найти окончательный UTC? - person basilisk; 04.11.2019
comment
@basilisk Ну, я знаю, что они выбрали 1980-01-06 вместо 1980-01-01, потому что это было воскресенье, а время GPS отслеживается по номеру недели и секундам недели, начиная с полуночи 00:00:00 воскресенья. утро. Но почему 1980? Я предполагаю, что это связано с появлением Navstar, но я не уверен. Re: добавление високосных секунд - да, если после лета 2017 года вы добавите 18 секунд к GPST, чтобы получить UTC. Обратитесь к вики-странице за таблицей високосных секунд и дат, когда они были добавлены. Они делают это очень актуальным. - person Phlucious; 06.11.2019

Это работает в VB6

Dim dtt As Date
dtt = "6 / 1 / 1980"
dtt = DateAdd("d", (1837 * 7), dtt)
dtt = DateAdd("s", 129414, dtt)

1837 — неделя GPS, 129414 — секунды недели.

person John    schedule 23.03.2015