2014-10-23 20 views
10

Milisaniye cinsinden datetime dizesine sahip olduğumuzda strptime için en iyi şey ne olurdu?C++ 11'de bir milisaniye tarihini ayrıştırmanın en iyi yolu nedir?

Verilen: millisseconds saklamaz struct tm çünkü

"30/03/09 16:31:32.121" 

biz düzenli strptime kullanamaz. Bunu başarabilecek yeni bir sınıf var mı?

+0

['std :: get_time'] (http://en.cppreference.com/w/cpp/io/manip/get_time), C++ 11'dir, ancak strptime'ın belirtimlerini yansıtır. Milisaniye kaydetmeniz mi gerekiyor yoksa sadece onu görüntülemeniz mi gerekiyor? –

+0

Amacım bu tarih saatini bir chrono zaman noktasında saklamak, böylece ayrıştırmak ve saklamak için ihtiyacım var. – Nezquick

+0

.1214 ile milisaniye sormuyorsunuz, ancak 1/10 milisaniye veya 100 mikrosaniye. –

cevap

6

İçine yıl/ay/gün dönüştürmek için days_from_civil kullanmak, sonra elle (int içine okuyarak ve çift saniye) Bu alanları ayrıştırmak verecek bir chrono::system_clock::time_point:

std::chrono::system_clock::time_point t(days(days_from_civil(y, m, d))); 

days olduğu:

using days = std::chrono::duration<int, std::ratio<86400>>; 

Bunu daha sonra saat, dakika ve saniye olarak ekleyebilirsiniz. fraksiyonel saniye işlemek için, hafif bir dans yapmak gerekir:

İsterseniz
double s; 
your_stream >> s; // 32.121 
using namespace std::chrono; 
duration<double> dsecs(s); 
seconds sec = duration_cast<seconds>(dsecs); 
milliseconds ms = duration_cast<milliseconds>(dsecs - sec); 
t += sec + ms; 

, senin milisaniye dönüşüm için round from here kullanın:

milliseconds ms = round<milliseconds>(dsecs - sec); 

duration_cast sıfıra doğru kesmek olduğunu. Diğer yuvarlama modları vardır: zemin, yuvarlak, tavan, at this link.

Kolay yeniden kullanım için tümünü temiz bir işleve sarın. :-)

Yukarıdaki kod, UTC'yi varsayar. Ayrıştırma yaptığınız tarihin/saatin UTC'den kaydığı biliniyorsa, bu ofseti ekleyebilir/çıkartabilirsiniz. Bilinen tüm uygulamalar, Unix time parçasını izler; bu, UTC saat diliminde 1970-01-01'den beri olan süredir.

Ben OP o zaman arayan gibiydi bir more general library geliştirdik bu cevabı yazarken yana Güncelleme

.

#include "date.h" 
#include <iostream> 
#include <sstream> 

int 
main() 
{ 
    std::istringstream in{"30/03/09 16:31:32.121\n" 
          "30/03/09 16:31:32.1214"}; 
    std::chrono::system_clock::time_point tp; 
    in >> date::parse("%d/%m/%y %T", tp); 
    using namespace date; 
    std::cout << tp << '\n'; 
    in >> date::parse(" %d/%m/%y %T", tp); 
    std::cout << tp << '\n'; 
} 

Bu çıkışlar: doğrudan böyle bir std::chrono::system_clock::time_point içine alt ikinci hassasiyetleri çeşitli ayrıştırabilir

2009-03-30 16:31:32.121000 
2009-03-30 16:31:32.121400 

Bu kütüphane başlangıçta tarif edildiği gibi aynı teknik ve araçlarını kullanmaktadır, ama paketlenir tek bir başlık kütüphanesi olarak gitmeye hazır.

+0

yerine genel bir çözüm istiyorum (henüz başka bir harici lib) Tarih bölümünün çalışmasını almak için düzenli time_t kullanıyorum :) İstediğimden itibaren deseni okumak için google: re2'yi kullanarak sona erdim biraz daha genel bir şey. Teşekkürler – Nezquick

İlgili konular