¿Hay alguna forma de obtener la fecha ... preferiblemente en formato AAAAMMDD ... en la zona horaria Australia/Sydney (no solo GMT + 11) ..... a través de C++ en Linux?Fecha en otra zona horaria: C++ en Linux
Gracias,
Roger
¿Hay alguna forma de obtener la fecha ... preferiblemente en formato AAAAMMDD ... en la zona horaria Australia/Sydney (no solo GMT + 11) ..... a través de C++ en Linux?Fecha en otra zona horaria: C++ en Linux
Gracias,
Roger
Sí, pero sólo tiene que utilizar los mecanismos de la biblioteca C estándar.
establecer la zona de tiempo deseado en el entorno mediante la creación de una cadena:
std::string tz = "TZ=Australia/Sydney";
putenv(const_cast<char *>(tz.c_str()));
tzset(); // Initialize timezone data
time_t aTime = time(NULL); // get the time - this is GMT based.
struct tm retTime;
localtime_r(aTime, &retTime); // Convert time into current timezone.
char destString[1024];
strftime(destString, 1023, "%Y%m%d %Z", &retTime); // Format the output in the local time.
std::cout << destString << std::endl;
El problema es que este código no es hilo de seguridad - hilos múltiples que cambian la información de zona horaria no termina bien.
This Answer Le da una forma de hacerlo mediante el impulso, que es definitivamente mucho más fácil.
Usando Boost.DateTime (Advertencia: no ensayado, para fines de ilustración solamente)
// Load the timezone database
tz_database db;
// TODO: Adjust this path to your environment
db.load_from_file("./boost/libs/date_time/data/date_time_zonespec.csv");
// Get the Sydney timezone
time_zone_ptr sydney_zone = db.time_zone_from_region("Australia/Sydney");
// Current date/time in Sydney
local_date_time sydney_time = local_sec_clock::local_time(sydney_zone);
// Format sydney_time in desired format
std::ostringstream formatter;
formatter.imbue(std::locale(), new local_time_facet("%Y%m%d"));
formatter << sydney_time;
Ver:
nueva respuesta para la vieja pregunta: ¿
El uso de este cross platform, open source C++11/C++14 timezone library uno puede escribir:
#include "tz.h"
#include <iostream>
int
main()
{
using namespace std::chrono;
using namespace std;
using namespace date;
auto ymd = make_zoned("Australia/Sydney", system_clock::now());
cout << format("%Y%m%d", ymd) << '\n';
}
Lo cual para mí de salida:
20150824
Es seguro para subprocesos. Está tan actualizado como la copia del IANA timezone database que acaba de descargar. Y si su fecha no es "ahora", usará correctamente los datos históricos de la base de datos IANA.