2009-10-14 11 views
6

Boost C++ tarih zaman kitaplığında garip bir sonuç keşfettim. microsec_clock ve second_clock arasında tutarsızlık var ve neden olduğunu anlamıyorum. Milisaniye olmadan ve milliseonds ile beklediğimBoost C++ date_time microsec_clock ve second_clock

using namespace boost::posix_time; 
... 
ptime now = second_clock::universal_time(); 
std::cout << "Current Time is: "<< to_iso_extended_string(now)<< std::endl; 
ptime now_2 = microsec_clock::universal_time(); 
std::cout << "Current Time is: "<< to_iso_extended_string(now_2)<< std::endl; 
... 

çıktısı geçerli zaman şunlardır: Windows XP 32-bitleri kodunun

My snip kullanıyorum. Ancak, ne benim pc var: a weired tarihi (yıl 1970 ???) benim microsec_clock zamanında oraya neden anlamıyorum

 
2009-10-14T16:07:38 
1970-06-24T20:36:09.375890 

. Hızlandırmak İçin İlgili belgeler: 1970 tarih büyük olasılıkla şekilde unix time geliyor link to boost date time

cevap

5

Sizin için neyin yanlış olabileceğinden emin değilsiniz; tam olarak aynı kod benim için çalışır.

 
$ cat > test.cc 
#include <boost/date_time/gregorian/gregorian.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
using namespace boost::posix_time; 
int main() { 
    ptime now = second_clock::universal_time(); 
    std::cout << "Current Time is: "<< to_iso_extended_string(now)<< std::endl; 
    ptime now_2 = microsec_clock::universal_time(); 
    std::cout << "Current Time is: "<< to_iso_extended_string(now_2)<< std::endl; 
    return 0; 
} 
^D 
$ c++ -lboost_date_time test.cc 
$ ./a.out 
Current Time is: 2009-10-14T16:26:55 
Current Time is: 2009-10-14T16:26:55.586295 

Uygulama açısından, second_clocktime kullanır ve microsec_clock platforma göre altında gettimeofday veya GetSystemTimeAsFileTime kullanır. Platformunuzda bir sorun var - İşletim Sisteminiz ve sürümünüz nedir?


Boost sürümünüz nedir? 1.38 veya daha düşükse, 1.39'a yükseltin veya düzeltmeyi el ile #2809'a uygulayın.

 
--- boost/date_time/filetime_functions.hpp (revision 53621) 
+++ boost/date_time/filetime_functions.hpp (revision 53622) 
@@ -96,9 +96,7 @@ 
    { 
     /* shift is difference between 1970-Jan-01 & 1601-Jan-01 
     * in 100-nanosecond intervals */ 
-  const uint64_t c1 = 27111902UL; 
-  const uint64_t c2 = 3577643008UL; // issues warning without 'UL' 
-  const uint64_t shift = (c1 << 32) + c2; 
+  const uint64_t shift = 116444736000000000ULL; // (27111902 << 32) + 3577643008 

     union { 
      FileTimeT as_file_time; 

, Windows FILETIME UNIX zamanını ofset farklı ve belirli optimize derleyici doğru ofset farkı oluşturmak olmaz önce Boost oldu kodu vardır.

+0

Tam olarak Win32 sistemi, Windows XP SP2 32 bit kullanıyorum. – Lily

+0

Eclipse 3.4.1 ve MingW 3.4 ile zaten 1.39 kullanıyorum. Ayrıca, uyarı yaşıyorum: Açıklama \t Kaynak \t Yol \t Yer \t Tip C: tip \t CommercialDetection hattı 101 \t C/C /boost/boost_1_39/boost/date_time/filetime_functions.hpp sol kaydırma sayısı> = genişlik ++ Sorun olarak peki – Lily

+0

Hmm, bu düzeltmenin 1,39 olduğunu sanıyordum ama ben kontrol edebilirim. – ephemient

1

1 Ocak tahmin ediyorum 1970. itibaren saniye olarak, temsil edilir belki bir şekilde milisaniye cinsinden sistem çalışma süresini alma ve yana saniye olarak yorumluyor 1970/01/01. Bu tarihle 4 saatten biraz fazla çalışma zamanı gelecekti.

1

second_clock aksine, microsec_clock::universal_time dokümantasyon bahseder: bilgisayar ayarlarına dayalı UTC zamanını döndürür .
Donanım saat ayarlarınızı kontrol etmelisiniz (veya herhangi bir zamanda microsec değerlerini alır).

düzenleme: kendi bilgisayarlarınız ile ilgili değilse
o boost bir kötü davranışı, ben son derece şüphe olması gerekir ayarları.

+0

Çok iyi bir nokta ve ayrıca şunu da buldum: Bir alt saniye çözünürlük saati kullanarak UTC saatini alın. Unix sistemlerinde, bu GetTimeOfDay kullanılarak uygulanır. Çoğu Win32 platformunda, ftime kullanılarak uygulanır. Win32 sistemleri genellikle bu API ile mikro saniye çözünürlüğü elde edemez. Uygulamanız için daha yüksek çözünürlük kritikse, elde ettiğiniz çözünürlüğü görmek için platformunuzu test edin. ===> Win32 sistemini kullanıyorum, bu yüzden belki de bilgisayarımda böyle bir çözünürlük yok. Sebebi bu olabilir. Ancak, çıktılar bana bir tarih verdiler, o zaman bu rakamlar nereden geliyor? ... – Lily

+0

Uygulaması ile o anki tarihten bir time_type ve bu doğru görüyorsam create_time() öğesinde ftime() üretir. –

+0

Ve eğer ftime() alt saniye çözünürlüğü desteklemiyorsa, yüksek çözünürlüğü ve bir sonraki en iyi çözünürlüğe geri dönüşü kaybetmeyi beklerim. –

İlgili konular