1932 / 1761 / 822
Регистрация: 23.01.2014
Сообщений: 6,205
|
||||||
1 | ||||||
Human Time to Unix Timestamp29.09.2015, 11:23. Просмотров 3347. Ответов 5
Метки нет Все метки)
(
Запутался с переводом времени
0
|
|
29.09.2015, 11:23 | |
UNIX-time с нуля Преобразование даты в Unix-time
|
|
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,412
|
|
29.09.2015, 14:29 | 2 |
Тут все просто:
Поэтому тут есть два пути. Либо переводить все в "локальном" времени, а затем преобразовывать в UTC. Либо, воспользоваться нестандартной функцией timegm вместо mktime.
0
|
1932 / 1761 / 822
Регистрация: 23.01.2014
Сообщений: 6,205
|
|
29.09.2015, 15:36 [ТС] | 3 |
Как?
У меня OS Windows 7: error: 'timegm' was not declared in this scope Пробовал _mkgmtime, пишет undefined reference to _mkgmtime.
0
|
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,412
|
|||||||||||
29.09.2015, 16:13 | 4 | ||||||||||
Использовать localtime вместо gmtime и сравнивать с значением локального времени.
Например, для моего часового пояса, 25.09.15 08:40:00 - это 1443156000. Т.е. как-то так:
![]() А если серьезно, то функция POSIX, естественно ее нет в вин. В вин, наверняка что-то из win api придется дергать. Добавлено через 10 минут pav1uxa, можно еще вычислить разницу (заранее один раз) и корректировать затем время самостоятельно.
Кстати, ты ведь знаешь, что функции типа localtime, gmtime не потокобезопасны? Добавлено через 3 минуты Вот, кстати, рабочий пример с timegm в *nix окружении. http://rextester.com/ZXJZS49318 Чтобы тебе не думалось, что я тебя обманывал ![]()
2
|
1932 / 1761 / 822
Регистрация: 23.01.2014
Сообщений: 6,205
|
|||||||||||
29.09.2015, 20:48 [ТС] | 5 | ||||||||||
даже не думал так думать) да я и сам находил эту функцию, очень много гуглил прежде чем создать тему.
нет, я в чистом c/c++ вообще мало чего знаю (оказывается). мне вообще не нравится sscanf и конструкция вида
Этот код все равно не дает мне желаемого результата. Мне нужно вводить время в UTC (неважно в каком я часовом поясе, всегда считаем что время вводится в UTC) и получать метку timestamp. Для времени 25.09.15 08:40:00 UTC метка должна быть 1443170400. Все это вообще никак не должно быть привязано ни к каким поясам. В каком бы часовом поясе я не ввел бы 25.09.15 08:40:00, результат всегда должен быть одинм - 1443170400. В этом примере в моем часовом поясе dt1 отличается от нужного результата на 3, а dt2 уходит еще дальше и отличается на 6. Добавлено через 10 минут В принципе похоже на правду, если еще поменять местами аргументы у difftime показывает нормальный результат
0
|
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,412
|
|||||||||||
30.09.2015, 13:47 | 6 | ||||||||||
По причинам, которые мне сейчас неочевидны, а времени разбираться особо нет, этот код не работает правильно в онлайн компиляторе. Поэтому я условно считаю, что этот вариант некорректный.
Вообще, послушай меня. Последние лет 5 я все больше склоняюсь к мысли, что в определенных ситуациях лучше написать хороший платформозависимый код, чем плохой универсальный. Поэтому хочу предложить тебе вот такое решение: Кликните здесь для просмотра всего текста
Запуск на win: http://rextester.com/KCW22877 Запуск на *nix: http://rextester.com/LBFF22059 On scanf в C++11 можно избавиться, там есть вот это: http://en.cppreference.com/w/cpp/io/manip/get_time Но эта штука еще не везде работает, а там, где работает - работает по-разному, я проверил. Поэтому в примере ее нет. Кроме того, в POSIX есть вот такая функция - strptime, с помощью которой всю твою задачу можно уложить в две строки. Кликните здесь для просмотра всего текста
http://rextester.com/COEDK80206 Но на винде работать не будет.
0
|
30.09.2015, 13:47 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Не могу разобраться с заданием "Создайте класс Time с конструкторами Time(), Time( int hour)......"
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |