AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77168398
Accepted
Martin Perry
Martin Perry
Asked: 2023-09-25 02:20:02 +0800 CST2023-09-25 02:20:02 +0800 CST 2023-09-25 02:20:02 +0800 CST

Como converter std::chrono::timezone converter biblioteca de datas HowardHinnant

  • 772

Eu tenho esse código em C++20 funcionando bem no MSVC. No entanto, minha versão do GCC não suporta fuso horário, então eu queria usar a biblioteca Howard Hinnant.

#include <chrono>

using LocalTime = std::chrono::time_point<std::chrono::local_t, std::chrono::system_clock::duration>;
//using LocalTime = std::chrono::local_time<std::chrono::system_clock::duration>;

using UtcTime = std::chrono::time_point<std::chrono::system_clock>;

LocalTime UtcToLocal(UtcTime t)
{       
    auto tz = std::chrono::current_zone();
    LocalTime tLocal = tz->to_local(t);
    return tLocal;
}

UtcTime LocalToUtc(LocalTime t)
{
    auto tz = chronoExt::current_zone();
    UtcTime tUtc = tz->to_sys(t);

    return tUtc;
}

Se eu mudar o código para:

#include "tz.h"
#include "date.h"

LocalTime UtcToLocal(UtcTime t)
{       
    auto tz = date::current_zone();
    LocalTime tLocal = tz->to_local(t);
    return tLocal;
}

UtcTime LocalToUtc(LocalTime t)
{
    auto tz = date::current_zone();
    UtcTime tUtc = tz->to_sys(t);

    return tUtc;
}

No MSVC recebi erros:

error C2440: 'initializing': cannot convert from 'std::chrono::time_point<date::local_t,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>' to 'std::chrono::time_point<std::chrono::local_t,std::chrono::system_clock::duration>'
message : No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
error C2672: 'date::time_zone::to_sys': no matching overloaded function found
message : could be 'std::chrono::time_point<std::chrono::system_clock,common_type<_Duration,std::chrono::seconds>::type> date::time_zone::to_sys(std::chrono::time_point<date::local_t,Duration>,date::choose) const'
message : 'std::chrono::time_point<std::chrono::system_clock,common_type<_Duration,std::chrono::seconds>::type> date::time_zone::to_sys(std::chrono::time_point<date::local_t,Duration>,date::choose) const': expects 2 arguments - 1 provided
message : or       'std::chrono::time_point<std::chrono::system_clock,common_type<_Duration,std::chrono::seconds>::type> date::time_zone::to_sys(std::chrono::time_point<date::local_t,Duration>) const'
message : 'std::chrono::time_point<std::chrono::system_clock,common_type<_Duration,std::chrono::seconds>::type> date::time_zone::to_sys(std::chrono::time_point<date::local_t,Duration>) const': could not deduce template argument for 'std::chrono::time_point<date::local_t,Duration>' from 'LocalTime'
c++
  • 2 2 respostas
  • 43 Views

2 respostas

  • Voted
  1. Howard Hinnant
    2023-09-25T02:43:34+08:002023-09-25T02:43:34+08:00

    Eu recomendo algo assim:

    #if USE_DATE_LIB
    
    #include "date/tz.h"
    
    namespace chronoExt = date;
    
    #else  // !USE_DATE_LIB
    
    namespace chronoExt = std::chrono;
    
    #endif
    

    Ou seja, #define USE_DATE_LIB 1(ou 0) para informar ao compilador em qual namespace procurar os chrono bits do C++ 20. No uso do MSVC USE_DATE_LIB = 0e no gcc (antes de 14) use USE_DATE_LIB = 1.

    Então você pode dizer:

    using LocalTime = std::chrono::time_point<chronoExt::local_t, std::chrono::system_clock::duration>;
    
    using UtcTime = std::chrono::time_point<std::chrono::system_clock>;
    
    LocalTime UtcToLocal(UtcTime t)
    {       
        auto tz = chronoExt::current_zone();
        LocalTime tLocal = tz->to_local(t);
        return tLocal;
    }
    
    UtcTime LocalToUtc(LocalTime t)
    {
        auto tz = chronoExt::current_zone();
        UtcTime tUtc = tz->to_sys(t);
    
        return tUtc;
    }
    

    E as coisas deveriam funcionar.

    • 2
  2. Best Answer
    TooTone
    2023-09-25T03:58:55+08:002023-09-25T03:58:55+08:00

    É possível fazer com que a biblioteca de datas de Howard Hinnant funcione em C++ 20 tanto no msvc quanto no gcc. Existem algumas vantagens, por exemplo, se você quiser ter certeza de que possui o mesmo banco de dados de fuso horário no Windows e no Linux (ou se sua caixa do Windows não for recente o suficiente para suportar o banco de dados de fuso horário) e, obviamente, se você não conseguir atualizar ao gcc mais recente por motivos corporativos. No entanto, se possível, recomendo atualizar para o gcc13 - eu fiz isso e tudo funciona no Windows e no Linux :).

    Para que a biblioteca de datas funcione, você precisa ter muito cuidado com o que escolher em qual biblioteca (ou seja, de quais bits vêm datee de quais std::chrono). Eu recomendo importar o que você precisa std::chronopara o datesnamespace e, em seguida, usar o datesnamespace em todo o seu código. No seu caso, especificamente, local_tprecisa vir de datenot std::chrono. Ou seja

    using LocalTime = std::chrono::time_point<date::local_t, std::chrono::system_clock::duration>;
    

    Para fazer com que seu programa seja compilado com/sem datas.h, configurei uma compilação condicional

    #define HHDATE
    #ifdef HHDATE
    #include "date/tz.h"
    #include "date/date.h"
    #else
    #include <chrono>
    namespace date = std::chrono;
    #endif
    

    (Observe também que se você usar o recurso de inserção ostream muito útil da biblioteca de HH, a linha return (os << sys_time<Duration>{ut.time_since_epoch()});poderá ser relatada como ambígua no Visual C++, caso em que poderá ser alterada para return date::operator<<(os, sys_time<Duration>{ut.time_since_epoch()});.)

    • 2

relate perguntas

  • Por que os compiladores perdem a vetorização aqui?

  • Erro de compilação usando CMake com biblioteca [fechada]

  • Erro lançado toda vez que tento executar o premake

  • Como criar um tipo de octeto semelhante a std::byte em C++?

  • Somente operações bit a bit para std::byte em C++ 17?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve