Форум программистов, компьютерный форум CyberForum.ru

Human Time to Unix Timestamp - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Error LNK1120: неразрешенных внешних элементов: 2 http://www.cyberforum.ru/cpp-beginners/thread1540353.html
Доброго времени суток. Не могу понять в чем ошибка. Подскажите, пожалуйста. Задание: Программно реализовать следующие методы сортировки данных в оперативной памяти: сортировка прямыми включения-ми; корпоративная сортировка. Оценить быстродействие указанных методов и степень естественности их поведения. #include <iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> #include...
C++ Односвязный список с данными о студентах Составить односвязный список на основе класса,объекты которого будут формтировать этот списо. В описание класса должны входить данные для хранения фамилии студента,номера группы,оценок по трём предметам: функции для доступа к отдельным компонентам списка,вывод на экран элементов списк,а так же среднего балла студента,добавление элемента в конец списка ,добавление элемента в начало... http://www.cyberforum.ru/cpp-beginners/thread1540321.html
C++ Функции для ввода/вывода массивов и матриц с помощью шаблонов и перегрузки
#include <iostream> #include <conio.h> using namespace std; template<class T> int mass(T mas, T iSize = sizeof(mas) / sizeof(int)); int mass(mas, iSize = sizeof(mas) / sizeof(int)); for (int ix = 0; ix < iSize; ix++)
C++ Класс "Окружность", три объекта изображающих движение
разработав класс окружность, создать три объекта изображающих движение: а)расширяющейся (сужающейся) окружности с неподвижным центром б)окружность постоянного радиуса, скользящий вдоль прямой в)окружности, осуществляющие два вышеописанных движения и имитирующее приближение (удаление) объекта в перспективе
C++ Rand() генерирует одни и те же числа http://www.cyberforum.ru/cpp-beginners/thread1540278.html
0100010010101010100011111101010101000010 щучу :p Всем привет, не найдя на форуме ответа, решил сделать тему, удалю как получу ответ ]:-> Есть rand() для генерации случайного числа. Но проблема в том , что при запуске программы, этот самый rand() су**,генерирует одни и те же числа, сколько раз не запускай программу. Как заставить его генерировать случайные числа в случайном порядке. Заранее...
C++ Внутреннее устройство потоков Очень тупой вопрос - почему std::ios хранит в своих потрохах указатель на объект std::streambuf, а не является потомком std::streambuf? Принимая во внимание что std::streambuf все равно собран на виртуальных функциях, а значит поведение std::ios один фиг в итоге задается через перегрузку этих самых виртуальных функций. подробнее

Показать сообщение отдельно
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
30.09.2015, 13:47     Human Time to Unix Timestamp
Цитата Сообщение от pav1uxa Посмотреть сообщение
Все же хотелось бы привести код к более аккуратному виду. Или сойдет?
По причинам, которые мне сейчас неочевидны, а времени разбираться особо нет, этот код не работает правильно в онлайн компиляторе. Поэтому я условно считаю, что этот вариант некорректный.

Вообще, послушай меня. Последние лет 5 я все больше склоняюсь к мысли, что в определенных ситуациях лучше написать хороший платформозависимый код, чем плохой универсальный.
Поэтому хочу предложить тебе вот такое решение:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <ctime>
#include <cstdio>
 
#ifdef _WIN32
#include <windows.h>
 
bool UTCToUnixTimeWin32(SYSTEMTIME const * stime, std::time_t * t)
{
    static SYSTEMTIME const t1970 = {
        1970, 1, 0, 1, 0, 0, 0, 0
    };
 
    FILETIME ftc, fts;
    if(::SystemTimeToFileTime(stime, &ftc)
    && ::SystemTimeToFileTime(&t1970, &fts))
    {
        ULARGE_INTEGER ltc = { { ftc.dwLowDateTime, ftc.dwHighDateTime } };
        ULARGE_INTEGER lts = { { fts.dwLowDateTime, fts.dwHighDateTime } };
        if(ltc.QuadPart >= lts.QuadPart)
        {
            *t = std::time_t( (ltc.QuadPart - lts.QuadPart) / 10000000 );
            return true;
        }
    }
    return false;
}
#endif
 
std::time_t UTCToUnixTime(std::string const & x)
{
    std::time_t tret = -1;
 
    int day,  month,  year;
    int hour, minute, second;
    if(std::sscanf(x.c_str(), "%d.%d.%d %d:%d:%d"
                   , &day, &month, &year
                   , &hour, &minute, &second) == 6)
    {
#ifdef _WIN32
        SYSTEMTIME const stime = {
            year / 100 == 0 ? 2000 + year : year, month, 0, day
          , hour, minute, second, 0
        };
        UTCToUnixTimeWin32(&stime, &tret);
#else
        std::tm dt = {};
        dt.tm_year = (year / 100 == 0 ? 2000 + year : year) - 1900;
        dt.tm_mon  = month - 1;
        dt.tm_mday = day;
        dt.tm_hour = hour;
        dt.tm_min  = minute;
        dt.tm_sec  = second;
 
        tret = ::timegm(&dt);
#endif
    }
    return tret;
}
 
int main()
{
    std::cout << UTCToUnixTime("25.09.15 08:40:00");
}

Запуск на 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, с помощью которой всю твою задачу можно уложить в две строки.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <ctime>
 
std::time_t GetTimeInUTC(std::string const & x)
{
    std::tm tm = {};
    ::strptime(x.c_str(), "%d.%m.%y %H:%M:%S", &tm);
    return ::timegm(&tm);    
}
 
int main()
{
    std::cout << GetTimeInUTC("25.09.15 08:40:00");
}

http://rextester.com/COEDK80206
Но на винде работать не будет.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru