Tarih/Saat dilimini almanın herhangi bir yolu var mı? .../YYYYMMDD biçiminde ... Avustralya/Sydney saat diliminde (sadece GMT + 11 değil) ..... C++ ile Linux?Başka bir zaman dilimi için tarih: Linux'ta C++
sayesinde
Roger
Tarih/Saat dilimini almanın herhangi bir yolu var mı? .../YYYYMMDD biçiminde ... Avustralya/Sydney saat diliminde (sadece GMT + 11 değil) ..... C++ ile Linux?Başka bir zaman dilimi için tarih: Linux'ta C++
sayesinde
Roger
Evet, ama sadece standart c kütüphanesi mekanizmalarını kullanırlar.
bir dize oluşturarak ortamda istenilen zaman dilimini ayarlayın: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;
sorun bu kod parçacığı güvenli olmamasıdır - iyi bitmiyor saat dilimi bilgilerini değiştirme birden konuları.
This Answer Bunu çok daha kolay olan destek kullanarak gerçekleştirmenin bir yolunu sunuyor. Boost.DateTime kullanarak
zaman dilimleri hakkında daha fazla bilgi için
// 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;
See (Uyarı yalnızca açıklama amaçlı, test edilmiştir). Biçimlendirme hakkında daha fazla bilgi için
Yeni cevap:
bu cross platform, open source C++11/C++14 timezone library biri yazabilir kullanma:
#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';
}
hangisi benim için sadece çıkış:
İplik güvenlidir20150824
. Yeni indirdiğiniz IANA timezone database kopyası kadar güncel. Ve eğer tarihiniz "şimdi" olmayacaksa, IANA veri tabanından geçmiş verileri doğru bir şekilde kullanacaktır.