Como comparar entre a hora UTC string (ISO 8601)

0

Pergunta

Eu estou tendo alguns problemas para comparar entre tempo de cadeias de caracteres que são em formato UTC.

Por exemplo:

string1 = "1997-07-16T19:20:30+01:00"
string2 = "2000-07-17T20:20:30+01:00"

Meu objetivo é descobrir qual o tempo é mais recente.

Eu tenho surfado através da internet e cerca de mktime(); Mas o exemplo cadeias de caracteres são em formato normal, por outro lado a minha cadeia é ISO8601 formato.

Eu estou procurando uma solução, que é compatível com windows e linux.

Eu realmente appriciate de alguma ajuda.

c++ datetime
2021-11-24 02:57:06
1

Melhor resposta

0

Para mais facilmente se levar em conta o deslocamento do UTC em campo, C++20 <chrono> é o caminho a percorrer. Se você tiver C++11/14/17, existe um livre, open-source, apenas do cabeçalho de pré-visualização de esta parte do C++20 que pode ser usado. E ele funciona tanto no Linux quanto no Windows. Se você estiver usando C, esta solução fácil não está disponível.

#include <chrono>
#include <iostream>
#include <sstream>

int
main()
{
    using namespace std;
    using namespace std::chrono;

    string string1 = "1997-07-16T19:20:30+01:00";
    string string2 = "2000-07-17T20:20:30+01:00";
    sys_seconds t1, t2;

    string format = "%FT%T%Ez";

    istringstream in{string1};
    in.exceptions(ios::failbit);
    in >> parse(format, t1);
    in.clear();
    in.str(string2);
    in >> parse(format, t2);

    if (t1 > t2)
        cout << string1 << " is later than " << string2 << '\n';
    else if (t2 > t1)
        cout << string2 << " is later than " << string1 << '\n';
    else
        cout << string1 << " is the same time as " << string2 << '\n';
}

Acima é o C++20 solução.

  • O tipo de sys_seconds é uma segundos precisão hora UTC. Quando este é analisado para com parse, analisada tempo, é considerado como a hora local, e modificado pela analisado o deslocamento UTC antes de ser atribuído à sys_seconds argumento. O E modificador na %Ez instrui parse ao olhar para o : no deslocamento. %z (sem o E) procura por um deslocamento do formulário hhmm.

  • Eu tenho o failbit na sequência, de modo a que quaisquer erros de análise resultar em um ruidoso exceção. Se você gostaria de verificação para in.fail() manualmente, omitir definição failbit.

  • Uma vez t1 e t2 são analisados em, podem ser comparadas apenas como tipos de aritmética.

  • Se você precisa usar o livre, open-source, apenas do cabeçalho de pré-visualização, basta adicionar #include "date/date.h" e using namespace date; para o programa acima.

Se você pode ter a certeza de que o utcs são sempre iguais, em seguida, uma simples comparação de seqüência de caracteres é suficiente:

if (string1 > string2)
    cout << string1 << " is later than " << string2 << '\n';
else if (string2 > string1)
    cout << string2 << " is later than " << string1 << '\n';
else
    cout << string1 << " is the same time as " << string2 << '\n';

Em C (e, se for o UTC deslocamentos podem ser diferentes), você vai ter que analisar os deslocamentos e subtraí-los a locais vezes manualmente.

2021-11-24 14:20:19

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................