2011-03-25 14 views
16

Geçerli zamanı bir "YYYY-AA-GG-HH-AA-SS" biçiminde biçimlendirilmiş dizeyi zarif bir şekilde elde etmeye çalışıyorum yol. Şu anki zamanı Boost'un "Date Time" kitaplığından alabilirim, fakat benim için çalışmayacak başka sınırlayıcı dizeler var (bunu bir dosya adıyla kullanıyorum). Elbette sınırlama dizelerini değiştirebilirim, ancak tarih-zamanın biçimlendirme seçenekleriyle bunu yapmanın daha güzel bir yolu olduğunu hissediyorum. Böyle bir yol var mı, eğer öyleyse, nasıl kullanabilirim?Geçerli zamanı bir YYYY-AA-GG-HH-AA-SS dizgisi olarak alma

cevap

30

Kullanım std::strftime, bu ++ standardı C'dir.

#include <cstdio> 
#include <ctime> 

int main() 
{ 
    std::time_t rawtime; 
    std::tm* timeinfo; 
    char buffer [80]; 

    std::time(&rawtime); 
    timeinfo = std::localtime(&rawtime); 

    std::strftime(buffer,80,"%Y-%m-%d-%H-%M-%S",timeinfo); 
    std::puts(buffer); 

    return 0; 
} 
+0

Bir 'std :: string' yazan ve böylece arabellek taşmaları hakkında hiçbir endişesi olmayan bir şey güzel olurdu. Anlaşılabilir bir şekilde, strftime'in öngörülebilir bir maksimum uzunluğa sahip olması beklenir. Herhangi bir gotcha var mı? –

+0

Herhangi bir ** iplik güvenli ** çözümü var mı? Bkz. [Link] (http://en.cppreference.com/w/cpp/chrono/c/localtime) - std :: localtime() iş parçacığı güvenli değil. – Yuri

2

Yanıt, alma ve alma ile ne demek istediğinize bağlıdır. Biçimlendirilmiş bir zaman dizesi çıkarmaya çalışıyorsanız, strftime() kullanın. Bir metin dizesini ikili bir biçimde ayrıştırmaya çalışıyorsanız, strptime() öğesini kullanın.