2016-01-12 16 views
5

Bis jetzt bin ich in der Lage, das aktuelle Gebietsschema zu erhalten, aber ich möchte das Datumsformat für dieses bestimmte Gebietsschema erhalten. Kann dies mit der Standardbibliothek gemacht werden?Wie bekomme ich das aktuelle "lokalisierte Muster" für das Datum und die Uhrzeit eines std :: locale

#include <locale> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    // Print the current locale 
    std::cout << std::locale("").name().c_str() << "\n"; 

    // TODO: get the locale's date pattern, example for US it's (mm/dd/yyyy) 
    std::cout << "date pattern: \n"; 
} 
+0

Es gibt 'std :: time_get :: date_order' –

+0

eigentlich boost :: date_time ist ziemlich nützlich für diese Art von Arbeit – ead

Antwort

4

Wenn Sie nur ein Datum in die entsprechende Zeichenfolge werfen möchten, können Sie std::time_put<char> verwenden:

#include <locale> 
#include <ctime> 
#include <string> 
#include <sstream> 
std::string get_date_string(const std::time_t &input_time, const std::locale &loc){ 
    std::tm * time = std::localtime (&input_time); 
    // get time_put facet: 
    const std::time_put<char>& tmput = std::use_facet <std::time_put<char> > (loc); 

    std::stringstream s; 
    s.imbue(loc);//set locale loc to the stream, no matter which global locale 

    std::tm *my_time=std::localtime(&input_time); 
    tmput.put (s, s, ' ', my_time, 'x'); 

    return s.str(); 
    } 

'x' sagt, dass Sie nur das Datum wollen. Andere Formate sind möglich - sie sind die gleichen wie für strftime. Jetzt, nach

int main(){ 

     std::time_t timestamp; 
     std::time(&timestamp); 

     std::cout<<"user settings: "<<get_date_string(timestamp, std::locale(""))<<"\n"; 
     std::cout<<"C settings: "<<get_date_string(timestamp, std::locale::classic())<<"\n"; 
} 

auf meiner deutschen Maschine das Programm laufen sehe ich:

user settings: 13.01.2016 
C settings: 01/13/16 

Wenn Sie frei sind Schub zu verwenden, als es ein bisschen leichter mit boost::data_time ist:

#include <boost/date_time/gregorian/gregorian.hpp 

using namespace boost::gregorian; 


std::string get_date_string_boost(const date &d, const std::locale &loc){ 
    date_facet* f = new date_facet("%x"); 
    std::stringstream s; 
    s.imbue(std::locale(loc, f)); 
    s<<d; 
    return s.str(); 
} 

und jetzt

ergibt das gleiche Ergebnis wie oben.

Wenn Sie das Datum, um explizit wissen wollen, ich glaube nicht, dass Sie mehr verlangen können, als zu wissen, ob es ddmmyy (yy) oder mmddyy (yy) oder ähnlich ist:

std::string date_order(const std::locale &loc){ 

     std::time_get<char>::dateorder order = std::use_facet<std::time_get<char> >(loc).date_order(); 
     switch (order) { 
     case std::time_get<char>::dmy : return "dd/mm/yyyy"; 
     case std::time_get<char>::mdy : return "mm/dd/yyyy"; 
     case std::time_get<char>::ymd : return "yyyy/mm/dd"; 
     case std::time_get<char>::ydm : return "yyyy/dd/mm"; 
     default: 
      return "no_order";//case std::time_get<char>::no_order 
     } 

    } 

I Ich weiß nicht, wie die Verteilung ist, auf meiner Maschine ist es "no_order", also erwarte nicht zu viele Informationen davon.

Verwandte Themen