LINUX.ORG.RU

Перевести время в секундах в формат YYYY-mm-dd HH:MM:SS

 , ,


0

1

Сабж.

Есть время в секундах. Это не то, чтобы время, а разница между двумя timestamp (timedelta). Эту разницу надо привести в формат YYYY-mm-dd HH:MM:SS.

Например, если timedelta = 61, то на выходе получаем 0000-00-00 00:01:01, ну и т.д.

Я могу использовать только C++03 и STL (значит, C++11/Boost/POCO/whatever использовать нельзя, увы). Естественно, код на C тоже подойдет.

Спасибо.

P.S. Есть решение навроде использования gmtime или ручного деления кол-ва секунд на константы (типа кол-во секунд в минуту и т.д.). Но первое работает не всегда верно, а второе дюже корявое.

★★

0000-00-00 00:01:01

struct tm по дефолту считает от «1900-01-00 00-00-00», просто учитывай это при выводе

Stil ★★★★★
()
Последнее исправление: Stil (всего исправлений: 1)
Ответ на: комментарий от Stil

Можно вычитать 1970-01-01, но смотрится коряво, и надо учитывать TZ (например, UTC+4), которое в общем случае мне не известно да и не имеет отнощение к задаче (мы переводим не время из формата в формат, а разницу (timedelta), тут TZ не играет роли).

maverik ★★
() автор топика
Ответ на: комментарий от anatoly

Я не совсем корректно выразился: gmtime работает верно, но опять же - TZ (см. сообщение выше).

maverik ★★
() автор топика
Ответ на: комментарий от router

Похоже что единственный вариант.

maverik ★★
() автор топика

Эту разницу надо привести в формат YYYY-mm-dd HH:MM:SS.

Вопрос на засыпку. Это не троллинг, а реально интересно. В свое время когда мне пришлось работать с delta-time в формате YYYY-mm-dd HH:MM:SS - я перешел на (weeks-optional), dd HH:MM:(SS-optional) и это частино решило вопрос.

Итак вопрос: представить в виде YYYY-mm-dd HH:MM:SS 126144000 секунд. Подвох - в високосном году. В зависимости от двух t1 и t2 разница (t2 - t1) вычисляется геморройно. А еще високосная секунда. И переводы time zone.

Тебе реально нужна дельта в формате YYYY-mm-dd HH:MM:SS ? Скорее всего, это бестолково

Deleted
()
Ответ на: комментарий от Deleted

Предлагаешь использовать dd HH:MM:SS. Я думаю, это подойдет. Можно посчитать банальным делением.

maverik ★★
() автор топика
Ответ на: комментарий от beastie

... поэтому я отказался от показа :SS в крупном масштабе. На длинных записях (у меня видео) - это НЕДЕЛИ + СУТКИ или СУТКИ + ЧАСЫ. А для точной информации специальные поля: ЧАСЫ + МИНУТЫ + СЕКУНДЫ и отдельно СЕКУНДЫ.

Ну, т.е., по аналогии, если ты сообщаешь, скажем дальность полета, юзеру 12500 км - это ОК. А для системы наведения нужно «показывать» 12498450 м" Масштабируй и округляй, короче. Это удобней. И не забывай оставить неокругленый оригинал для точных нужд.

Deleted
()

Велосипеды это конечно всегда найс, но дейcвительно всё настолько плохо, что даже ICU нельзя? Просто у меня был опыт написания подобного функционала, там довольно таки много деталей, если хочется получать точный результат.

batbko
()
Ответ на: комментарий от beastie

Во времена, когда мужчины были настоящими мужчинами, деревья были высоки, а небо - черно от птеродактилей, находились смельчаки: тыц

Прошу обратить внимание на лицензию, не WTFPL конечно, но древнее, проще и круче имхо:)

batbko
()
Последнее исправление: batbko (всего исправлений: 1)
Ответ на: комментарий от batbko

Сложность не в коде, а в том, что сама база tz жутко муторная вещь сама по с себе. Чего там только нет. И скачки по времени (когда были пропущены целые дни и месяцы) и переходы на зимнее/летнее, которые мульён раз менялись и у каждой страны разные. И куча всего другого.

ref: http://openbsd.cs.toronto.edu/cgi-bin/cvsweb/src/share/zoneinfo/datfiles/

beastie ★★★★★
()

Интервал между timestamp'ами переводить в формат timestamp'а - излишество.

В таком виде он ни для чего не применим, кроме как для хранения в полях типа timestamp. Чтобы им воспользоваться так или иначе, его придётся снова переводить в число.

blexey ★★★★★
()
Ответ на: комментарий от beastie

Посмотри внимательнее на задачу. У него не timestamp, а delta. Она не привязана ни к какой дате. Перевести её в месяцы можно только приблизительно

router ★★★★★
()
Ответ на: комментарий от router

Перевести её в месяцы можно только приблизительно

КМК, проще использовать дни-часы-минуты-секунды для такого. Можно ещё недели добавить. Но месяцы и годы - не вариант.

sT331h0rs3 ★★★★★
()

А високосные годы вы как собираетесь учитывать? А переходы на летнее-зимнее время между timestamps? Вывод: решаете не ту задачу.

Правильнее каждый из timestamp перевести в

struct{
year,
month,
day,
hour,
minutes,
seconds
}
и написать для них правильный operator-(...)

g0t0
()
Ответ на: комментарий от maverik

А лишний час при переходе на летнее/зимнее время?

g0t0
()

например, так:

#include <iostream>
#include <ctime>

using namespace std;

int main()
{
  time_t now = time(NULL);
  tm * ptm = localtime(&now);
  char buffer[50];
  strftime(buffer, 50, "%d.%m.%Y %H:%M:%S", ptm);
  cout << "seconds: " << now << endl;
  cout << "formatted time: " << buffer << endl;
return 0;
}
[/quote]

Iron_Bug ★★★★★
()

Если вам нужна дельта в хитром формате, то зачем вам нужна TZ? Зачем вам знание високосного года, часового пояса и учет секунды в году?
Без знания точки отсчета все эти данные не имеют смысла, а значит вы смело можете принять строгое количество секунд в году и воспользоваться операцией деления.

andreyu ★★★★★
()
Ответ на: комментарий от g0t0

А переходы на летнее-зимнее время между timestamps?

Речь о дельте. Вне зависимости от високосного года, летнего/зимнего времени между двумя датами пройдет все равно строгое количество секунд.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Собственно я так уже и сделал. Остановился на формате: 666 days, 12:34:56

maverik ★★
() автор топика
Ответ на: комментарий от andreyu

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

g0t0
()
Ответ на: комментарий от g0t0

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

Какой нафиг календарь, если речь идет о дельте без привязки к какой-либо дате?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Подумай головой о том, сколько месяцев прошло между датами, если разница в днях между ними составила 30 дней.

g0t0
()
Ответ на: комментарий от g0t0

Подумай головой о том, сколько месяцев прошло между датами, если разница в днях между ними составила 30 дней.

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

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

1 января - 31 января.

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

g0t0
()
Ответ на: комментарий от g0t0

1 января - 31 января.
Месяц не прошел. Мне хотя бы учительница может помочь, а вам уже только в саван заворчиваться и ползти в сторону кладбища.

Какая сложная математика ...для идиота.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Рад, что вы готовы так открыто признавать свой диагноз. В современном мире не многие обладают такой смелостью и честностью одновременно.

g0t0
()

Есть QDateTime, и там на это дело нужно две строчки. Желаю удачных извращений с голыми крестами...

anonymous
()
Ответ на: комментарий от anonymous

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

maverik ★★
() автор топика
Ответ на: комментарий от g0t0

Рад, что вы готовы так открыто признавать свой диагноз. В современном мире не многие обладают такой смелостью и честностью одновременно.

Идиотушко настолько туп, что даже не смог это осознать?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

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

g0t0
()
Ответ на: комментарий от g0t0

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

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

Может быть вам все же к доктору повторно сходить?

Да, сходите.

Сейчас многие болезни лечаться, может быть и вам помочь смогут?

Походу вам то не смогли еще помочь. Аль надежда все же есть?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

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

Лучше посчитай, сколько месяцев пройдет с 1 февраля по 1 марта, если вычисления проводить по предложенному тобой способу. А сколько месяцев ты насчитаешь в 30 годах? Но ведь их должно быть ровно 12*30.

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

g0t0
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.