Как правило, получение даты и времени - PullRequest
0 голосов
/ 20 февраля 2019

Я знаю, что этот вопрос, возможно, задавался раньше, но это продолжение одного из моих предыдущих вопросов, найденных здесь .Что делает это уникальным из других вопросов, так это то, что я ищу что-то актуальное и актуальное для моего компилятора: Visual Studio 2017 с использованием C ++ 17 - последний черновой стандарт.

Я знаю, что со временем C++ 20 будет выпущен и доступен для Visual Studio 2019, в которой я с нетерпением жду.Однако в настоящее время;Я все еще использую Visual Studio 2017 на Windows 7, и в настоящее время я ограничен C ++ 17.Я нашел этот Q / A , который похож на этот, который предложил отличные ответы, однако, когда я начал использовать <ctime> или <time.h> функции, такие как:

std::gmtime()
std::localtime()

Мой компилятор кричит мне, что эти функции помечены как небезопасные и устарели.Я пытался написать такую ​​функцию:

-DateAndTime.h-

#pragma once

#include <ctime>
#include <iomanip>
#include <iostream>
#include <sstream>  

namespace util {

    enum class TimeLocale {
        LOCAL = 0x01,
        GMT   = 0x02,
        BOTH = (LOCAL | GMT)
    };

    inline TimeLocale operator|(TimeLocale a, TimeLocale b) {
        return static_cast<TimeLocale>(static_cast<int>(a) | static_cast<int>(b)); 
    }

#pragma warning( push )
#pragma warning( disable : 4996 )
    inline void currentDateAndTime(std::stringstream& stream, TimeLocale locale) {
        std::time_t t = std::time(nullptr);

        if (locale == TimeLocale::GMT) {
            stream << "UTC:   " << std::put_time( std::gmtime(&t), "%c, %Z") << '\n';
        }

        if (locale == TimeLocale::LOCAL) {
            stream << "LOCAL: " << std::put_time(std::localtime(&t), "%c, %Z") << '\n';
        }

        if (locale == TimeLocale::BOTH) {
            stream << "UTC:   " << std::put_time(std::gmtime(&t), "%c, %Z") << '\n'
                   << "LOCAL: " << std::put_time(std::localtime(&t), "%c, %Z") << '\n';
        }
    }
#pragma warning( pop )

} // namespace util

-main.cpp-

#include "DateAndTime.h"

#include <iostream>
#include <sstream>

using namespace util;

int main() {
    try {
        std::stringstream stream1;
        getCurrentTime(stream1, TimeLocale::GMT);
        std::cout << stream1.str() << '\n';

        std::stringstream stream2;
        getCurrentTime(stream2, TimeLocale::LOCAL);
        std::cout << stream2.str() << '\n';

        std::stringstream stream3;
        getCurrentTime(stream3, TimeLocale::BOTH);
        std::cout << stream3.str() << '\n';

        std::stringstream stream4;
        getCurrentTime(stream4, TimeLocale::GMT | TimeLocale::LOCAL);
        std::cout << stream4.str() << '\n';         

    // ExceptionHandler is one of my class's and can be ignored in this context
    // You can replace this with std::exception, std::cerr, etc...
    } catch ( ExceptionHandler& e ) {
        std::cout << "Exception Thrown: " << e.getMessage() << std::endl;
        return EXIT_FAILURE;
    } catch (...) {
        std::cout << __FUNCTION__ << " Caught Unknown Exception" << std::endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

Это прекрасно работает, если я использую #pragma warning( disable : 4996 )

И получаю хороший вывод, подобный этому:

UTC:   02/20/19 05:44:38, Eastern Standard Time

Local: 02/20/19 00:44:38, Eastern Standard Time

UTC:   02/20/19 05:44:38, Eastern Standard Time
Local: 02/20/19 00:44:38, Eastern Standard Time

UTC:   02/20/19 05:44:38, Eastern Standard Time
Local: 02/20/19 00:44:38, Eastern Standard Time

Что выглядит великолепно.Однако я бы предпочел не использовать какие-либо функции, помеченные как устаревшие, которые не зависят от платформы, являются как можно более универсальными, переносимыми и кросс-платформенными, что в настоящее время доступно в C ++ 17.Желательно что-то из стандартной библиотеки.Я не хочу использовать стороннюю библиотеку, ни Boost.std::chrono было бы неплохо, но их раздел calendar не будет доступен до полной версии C ++ 20.Какие варианты у меня остались?

1 Ответ

0 голосов
/ 22 февраля 2019

Функции gmtime и localtime не устарели.

Только для Visual Studio они устарели, потому что Visual Studio предлагает альтернативные gmtime_s и localtime_s, поэтому я бы использовал эти функции.А в Unix у вас есть gmtime_r и localtime_r, если вы хотите быть поточно-ориентированным.См. Также этот ответ

Напишите встроенные gmtime_r и localtime_r под Windows, которые вызывают gmtime_s и localtime_s, и у вас есть почти стандартное кроссплатформенное решение до C ++ 20.

...