2010-10-04 5 views

Répondre

14

Il y a deux parties à cette question:

  1. Obtenez le décalage horaire UTC comme boost::posix_time::time_duration
  2. Format du time_duration comme spécifié

Apparemment, obtenir le fuseau horaire local est pas très bien exposé dans une API largement implémentée. Nous pouvons cependant l'obtenir en prenant la différence d'un moment par rapport à UTC et au même moment par rapport à la zone de l'heure actuelle, comme ceci:

boost::posix_time::time_duration get_utc_offset() { 
    using namespace boost::posix_time; 

    // boost::date_time::c_local_adjustor uses the C-API to adjust a 
    // moment given in utc to the same moment in the local time zone. 
    typedef boost::date_time::c_local_adjustor<ptime> local_adj; 

    const ptime utc_now = second_clock::universal_time(); 
    const ptime now = local_adj::utc_to_local(utc_now); 

    return now - utc_now; 
} 

Mise en forme du décalage comme spécifié est juste une question de imprégnant le droit time_facet:

std::string get_utc_offset_string() { 
    std::stringstream out; 

    using namespace boost::posix_time; 
    time_facet* tf = new time_facet(); 
    tf->time_duration_format("%+%H:%M"); 
    out.imbue(std::locale(out.getloc(), tf)); 

    out << get_utc_offset(); 

    return out.str(); 
} 

maintenant, get_utc_offset_string() va donner le résultat souhaité.

+0

C'est une question complexe; un décalage UTC spécifique peut correspondre à plusieurs fuseaux horaires, par exemple. –

+0

@Roger: Alors ... je suppose que la bonne façon de le dire est que je cherche le décalage UTC pour l'heure actuelle, pas pour le fuseau horaire? –

+1

Oui, si c'est ce qui vous intéresse (ce qui est aussi ce que cela me semble), cette réponse est sur place. Je répondais plus à "obtenir le fuseau horaire local n'est pas très bien exposé dans une API largement mise en œuvre." Sachez simplement que le décalage UTC que vous obtenez aujourd'hui pourrait être différent plus tard (ou plus tôt). –

1

Depuis C++ 11 vous pouvez utiliser chrono std::put_time:

#include <chrono> 
#include <iomanip> 
#include <iostream> 
int main() 
{ 

    using sc = std::chrono::system_clock; 
    auto tm = sc::to_time_t(sc::now()); 

    std::cout << std::put_time(std::localtime(&tm), "formatted time: %Y-%m-%dT%X%z\n"); 

    std::cout << "just the offset: " << std::put_time(std::localtime(&tm), "%z\n"); 

} 

Ceci produit la sortie suivante:

temps formaté: 2018-02-15T10: 25: 27 + 0100

juste le décalage: 0100

Questions connexes