Jeśli chcesz po prostu rzucić datę do analogicznego ciąg można użyć std::time_put<char>
:
#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'
mówi, że chcesz tylko datę. Możliwe są inne formaty - są takie same jak w przypadku strftime. Teraz, po uruchomieniu programu
int main(){
std::time_t timestamp;
std::time(×tamp);
std::cout<<"user settings: "<<get_date_string(timestamp, std::locale(""))<<"\n";
std::cout<<"C settings: "<<get_date_string(timestamp, std::locale::classic())<<"\n";
}
na mojej niemieckiej maszyny widzę:
user settings: 13.01.2016
C settings: 01/13/16
Jeśli jesteś wolny, aby korzystać zastrzyk, niż to jest trochę łatwiej z boost::data_time:
#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();
}
, a teraz
int main(){
date d(2015, Jan, 13);
std::cout<<"user settings with boost: "<<get_date_string_boost(d, std::locale(""))<<"\n";
std::cout<<"C settings with boost: "<<get_date_string_boost(d, std::locale::classic())<<"\n";
}
daje taki sam wynik jak powyżej.
Jeśli chcesz poznać data wyraźnie, nie sądzę, można prosić o więcej, niż wiedzieć, czy jest ddmmrr (yy) lub mmddrr (yy) lub podobne:
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 nie wiem jak jest dystrybucja, na mojej maszynie to "no_order", więc nie oczekuj od niej zbyt wielu informacji.
Istnieje 'std :: time_get :: date_order' –
faktycznie boost :: date_time jest bardzo przydatne dla tego rodzaju pracy – ead