Apakah ada cara lintas platform untuk mendapatkan tanggal dan waktu saat ini di C ++?
tm
struktur. Bukankah pendekatan C ++ 11 hanya memberikan cap waktu unix (waktu sejak zaman) meskipun pertanyaannya adalah tentang mendapatkan tanggal dan waktu?
Apakah ada cara lintas platform untuk mendapatkan tanggal dan waktu saat ini di C ++?
tm
struktur. Bukankah pendekatan C ++ 11 hanya memberikan cap waktu unix (waktu sejak zaman) meskipun pertanyaannya adalah tentang mendapatkan tanggal dan waktu?
Jawaban:
Di C ++ 11 Anda dapat menggunakan std::chrono::system_clock::now()
Contoh (disalin dari en.cppreference.com ):
#include <iostream>
#include <chrono>
#include <ctime>
int main()
{
auto start = std::chrono::system_clock::now();
// Some computation here
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end-start;
std::time_t end_time = std::chrono::system_clock::to_time_t(end);
std::cout << "finished computation at " << std::ctime(&end_time)
<< "elapsed time: " << elapsed_seconds.count() << "s\n";
}
Ini akan mencetak sesuatu seperti ini:
finished computation at Mon Oct 2 00:59:08 2017
elapsed time: 1.88232s
string
dari stream
, atau cara memformat dengan benar time_point<>
, silakan dan ajukan pertanyaan lain atau google setelahnya.
C ++ membagikan fungsi tanggal / waktu dengan C. Struktur tm mungkin yang paling mudah digunakan oleh seorang programmer C ++ - berikut ini adalah tanggal hari ini:
#include <ctime>
#include <iostream>
int main() {
std::time_t t = std::time(0); // get time now
std::tm* now = std::localtime(&t);
std::cout << (now->tm_year + 1900) << '-'
<< (now->tm_mon + 1) << '-'
<< now->tm_mday
<< "\n";
}
ctime()
bersama dengan jawaban ini jika Anda menginginkan string tanggal.
struct tm
apakah mungkin untuk memanggil delete saja?
delete
(c ++ kata kunci) di atasnya, saya hanya berpikir itu harus dihapus entah bagaimana :) atau siapa yang akan melakukannya untuk Anda?
Anda dapat mencoba kode lintas platform berikut untuk mendapatkan tanggal / waktu saat ini:
#include <iostream>
#include <string>
#include <stdio.h>
#include <time.h>
// Get current date/time, format is YYYY-MM-DD.HH:mm:ss
const std::string currentDateTime() {
time_t now = time(0);
struct tm tstruct;
char buf[80];
tstruct = *localtime(&now);
// Visit http://en.cppreference.com/w/cpp/chrono/c/strftime
// for more information about date/time format
strftime(buf, sizeof(buf), "%Y-%m-%d.%X", &tstruct);
return buf;
}
int main() {
std::cout << "currentDateTime()=" << currentDateTime() << std::endl;
getchar(); // wait for keyboard input
}
Keluaran:
currentDateTime()=2012-05-06.21:47:59
Silakan kunjungi di sini untuk informasi lebih lanjut tentang format tanggal / waktu
const
nilai? Itu tanpa tujuan.
std C menyediakan perpustakaan time()
. Ini adalah detik dari zaman dan dapat dikonversi ke tanggal dan H:M:S
menggunakan fungsi C standar. Boost juga memiliki perpustakaan waktu / tanggal yang dapat Anda periksa.
time_t timev;
time(&timev);
pustaka standar C ++ tidak memberikan tipe tanggal yang tepat. C ++ mewarisi struct dan fungsi untuk manipulasi tanggal dan waktu dari C, bersama dengan beberapa fungsi input dan output tanggal / waktu yang memperhitungkan lokalisasi akun.
// Current date/time based on current system
time_t now = time(0);
// Convert now to tm struct for local timezone
tm* localtm = localtime(&now);
cout << "The local date and time is: " << asctime(localtm) << endl;
// Convert now to tm struct for UTC
tm* gmtm = gmtime(&now);
if (gmtm != NULL) {
cout << "The UTC date and time is: " << asctime(gmtm) << endl;
}
else {
cerr << "Failed to get the UTC date and time" << endl;
return EXIT_FAILURE;
}
Jawaban baru untuk pertanyaan lama:
Pertanyaannya tidak menentukan di zona waktu apa. Ada dua kemungkinan yang masuk akal:
Untuk 1, Anda dapat menggunakan perpustakaan tanggal ini dan program berikut:
#include "date.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
std::cout << system_clock::now() << '\n';
}
Yang hanya menghasilkan bagi saya:
2015-08-18 22:08:18.944211
Pustaka tanggal pada dasarnya hanya menambahkan operator streaming untuk std::chrono::system_clock::time_point
. Ini juga menambahkan banyak fungsi bagus lainnya, tetapi itu tidak digunakan dalam program sederhana ini.
Jika Anda lebih suka 2 (waktu setempat), ada perpustakaan zona waktu yang dibangun di atas perpustakaan tanggal . Kedua pustaka ini adalah open source dan cross platform , dengan asumsi kompiler mendukung C ++ 11 atau C ++ 14.
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
auto local = make_zoned(current_zone(), system_clock::now());
std::cout << local << '\n';
}
Yang bagi saya hanya keluaran:
2015-08-18 18:08:18.944211 EDT
Jenis hasil dari make_zoned
adalah date::zoned_time
yang merupakan pasangan dari a date::time_zone
dan a std::chrono::system_clock::time_point
. Pasangan ini mewakili waktu lokal, tetapi juga bisa mewakili UTC, tergantung pada bagaimana Anda menanyakannya.
Dengan output di atas, Anda dapat melihat bahwa komputer saya saat ini berada di zona waktu dengan offset UTC -4j, dan singkatan dari EDT.
Jika beberapa zona waktu lain diinginkan, itu juga dapat dicapai. Misalnya untuk mencari waktu saat ini di Sydney, Australia hanya mengubah konstruksi variabel local
menjadi:
auto local = make_zoned("Australia/Sydney", system_clock::now());
Dan output berubah menjadi:
2015-08-19 08:08:18.944211 AEST
Perpustakaan ini sekarang sebagian besar diadopsi untuk C ++ 20. Namespace date
hilang dan semuanya ada dalam namespace std::chrono
sekarang. Dan gunakan zoned_time
di tempat make_time
. Jatuhkan tajuk "date.h"
dan "tz.h"
dan gunakan saja <chrono>
.
Ketika saya menulis ini, implementasi parsial baru mulai muncul pada beberapa platform.
localtime
memberi saya waktu di zona waktu saya?
localtime
akan hampir selalu memberikan waktu dalam zona waktu lokal Anda untuk presisi kedua. Kadang-kadang itu akan gagal karena masalah keamanan threads, dan itu tidak akan pernah bekerja untuk presisi subsecond.
(Untuk sesama orang Google)
Ada juga Boost :: date_time :
#include <boost/date_time/posix_time/posix_time.hpp>
boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::universal_time();
auto time = std::time(nullptr);
std::cout << std::put_time(std::localtime(&time), "%F %T%z"); // ISO 8601 format.
Dapatkan waktu saat ini baik menggunakan std::time()
atau std::chrono::system_clock::now()
(atau jenis jam lain ).
std::put_time()
(C ++ 11) dan strftime()
(C) menawarkan banyak format untuk menampilkan waktu itu.
#include <iomanip>
#include <iostream>
int main() {
auto time = std::time(nullptr);
std::cout
// ISO 8601: %Y-%m-%d %H:%M:%S, e.g. 2017-07-31 00:42:00+0200.
<< std::put_time(std::gmtime(&time), "%F %T%z") << '\n'
// %m/%d/%y, e.g. 07/31/17
<< std::put_time(std::gmtime(&time), "%D");
}
Urutan formatters penting:
std::cout << std::put_time(std::gmtime(&time), "%c %A %Z") << std::endl;
// Mon Jul 31 00:00:42 2017 Monday GMT
std::cout << std::put_time(std::gmtime(&time), "%Z %c %A") << std::endl;
// GMT Mon Jul 31 00:00:42 2017 Monday
Formatters strftime()
serupa:
char output[100];
if (std::strftime(output, sizeof(output), "%F", std::gmtime(&time))) {
std::cout << output << '\n'; // %Y-%m-%d, e.g. 2017-07-31
}
Seringkali, formatter kapital berarti "versi lengkap" dan huruf kecil berarti singkatan (mis. Y: 2017, y: 17).
Pengaturan lokal mengubah output:
#include <iomanip>
#include <iostream>
int main() {
auto time = std::time(nullptr);
std::cout << "undef: " << std::put_time(std::gmtime(&time), "%c") << '\n';
std::cout.imbue(std::locale("en_US.utf8"));
std::cout << "en_US: " << std::put_time(std::gmtime(&time), "%c") << '\n';
std::cout.imbue(std::locale("en_GB.utf8"));
std::cout << "en_GB: " << std::put_time(std::gmtime(&time), "%c") << '\n';
std::cout.imbue(std::locale("de_DE.utf8"));
std::cout << "de_DE: " << std::put_time(std::gmtime(&time), "%c") << '\n';
std::cout.imbue(std::locale("ja_JP.utf8"));
std::cout << "ja_JP: " << std::put_time(std::gmtime(&time), "%c") << '\n';
std::cout.imbue(std::locale("ru_RU.utf8"));
std::cout << "ru_RU: " << std::put_time(std::gmtime(&time), "%c");
}
Kemungkinan hasil ( Coliru , Compiler Explorer ):
undef: Tue Aug 1 08:29:30 2017
en_US: Tue 01 Aug 2017 08:29:30 AM GMT
en_GB: Tue 01 Aug 2017 08:29:30 GMT
de_DE: Di 01 Aug 2017 08:29:30 GMT
ja_JP: 2017年08月01日 08時29分30秒
ru_RU: Вт 01 авг 2017 08:29:30
Saya telah menggunakan std::gmtime()
konversi ke UTC. std::localtime()
disediakan untuk dikonversi ke waktu setempat.
Perhatikan bahwa asctime()
/ ctime()
yang disebutkan dalam jawaban lain ditandai sudah ditinggalkan sekarang dan strftime()
harus lebih disukai.
Ya dan Anda dapat melakukannya dengan aturan pemformatan yang ditentukan oleh lokal yang saat ini diimbuhi:
#include <iostream>
#include <iterator>
#include <string>
class timefmt
{
public:
timefmt(std::string fmt)
: format(fmt) { }
friend std::ostream& operator <<(std::ostream &, timefmt const &);
private:
std::string format;
};
std::ostream& operator <<(std::ostream& os, timefmt const& mt)
{
std::ostream::sentry s(os);
if (s)
{
std::time_t t = std::time(0);
std::tm const* tm = std::localtime(&t);
std::ostreambuf_iterator<char> out(os);
std::use_facet<std::time_put<char>>(os.getloc())
.put(out, os, os.fill(),
tm, &mt.format[0], &mt.format[0] + mt.format.size());
}
os.width(0);
return os;
}
int main()
{
std::cout << timefmt("%c");
}
Keluaran:
Fri Sep 6 20:33:31 2013
ostream::sentry
sering melihatnya ).
Anda bisa menggunakan kelas waktu C ++ 11:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
time_t now = chrono::system_clock::to_time_t(chrono::system_clock::now());
cout << put_time(localtime(&now), "%F %T") << endl;
return 0;
}
Keluarkan:
2017-08-25 12:30:08
Selalu ada __TIMESTAMP__
makro preprosesor.
#include <iostream>
using namespace std
void printBuildDateTime () {
cout << __TIMESTAMP__ << endl;
}
int main() {
printBuildDateTime();
}
contoh: Sun 13 Apr 11:28:08 2014
__TIMESTAMP__
adalah makro preprosesor yang mengembang ke waktu saat ini (pada waktu kompilasi) dalam bentuk Ddd Mmm Tanggal hh :: mm :: ss yyyy. The __TIMESTAMP__
makro dapat digunakan untuk memberikan informasi tentang momen tertentu biner dibangun. Merujuk: cprogramming.com/reference/preprocessor/__TIMESTAMP__.html
Anda juga dapat langsung menggunakan ctime()
:
#include <stdio.h>
#include <time.h>
int main ()
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
printf ( "Current local time and date: %s", ctime (&rawtime) );
return 0;
}
#define _CRT_SECURE_NO_DEPRECATE
sebelum memasukkan untuk membuat kompilasi program
Saya menemukan tautan ini cukup berguna untuk implementasi saya: C ++ Tanggal dan Waktu
Inilah kode yang saya gunakan dalam implementasi saya, untuk mendapatkan format output "YYYYMMDD HHMMSS" yang jelas. Param in adalah untuk beralih antara UTC dan waktu lokal. Anda dapat dengan mudah mengubah kode saya sesuai kebutuhan Anda.
#include <iostream>
#include <ctime>
using namespace std;
/**
* This function gets the current date time
* @param useLocalTime true if want to use local time, default to false (UTC)
* @return current datetime in the format of "YYYYMMDD HHMMSS"
*/
string getCurrentDateTime(bool useLocalTime) {
stringstream currentDateTime;
// current date/time based on current system
time_t ttNow = time(0);
tm * ptmNow;
if (useLocalTime)
ptmNow = localtime(&ttNow);
else
ptmNow = gmtime(&ttNow);
currentDateTime << 1900 + ptmNow->tm_year;
//month
if (ptmNow->tm_mon < 9)
//Fill in the leading 0 if less than 10
currentDateTime << "0" << 1 + ptmNow->tm_mon;
else
currentDateTime << (1 + ptmNow->tm_mon);
//day
if (ptmNow->tm_mday < 10)
currentDateTime << "0" << ptmNow->tm_mday << " ";
else
currentDateTime << ptmNow->tm_mday << " ";
//hour
if (ptmNow->tm_hour < 10)
currentDateTime << "0" << ptmNow->tm_hour;
else
currentDateTime << ptmNow->tm_hour;
//min
if (ptmNow->tm_min < 10)
currentDateTime << "0" << ptmNow->tm_min;
else
currentDateTime << ptmNow->tm_min;
//sec
if (ptmNow->tm_sec < 10)
currentDateTime << "0" << ptmNow->tm_sec;
else
currentDateTime << ptmNow->tm_sec;
return currentDateTime.str();
}
Output (UTC, EST):
20161123 000454
20161122 190454
ptmNow->tm_day < 9
dan bukan <10
?
<=9
karena Anda ingin memasukkan juga 9.
1+
dalam kode. Hari / Bulan dimulai pukul 0.
Ini berfungsi dengan G ++ Saya tidak yakin apakah ini membantu Anda. Output program:
The current time is 11:43:41 am
The current date is 6-18-2015 June Wednesday
Day of month is 17 and the Month of year is 6,
also the day of year is 167 & our Weekday is 3.
The current year is 2015.
Kode:
#include <ctime>
#include <iostream>
#include <string>
#include <stdio.h>
#include <time.h>
using namespace std;
const std::string currentTime() {
time_t now = time(0);
struct tm tstruct;
char buf[80];
tstruct = *localtime(&now);
strftime(buf, sizeof(buf), "%H:%M:%S %P", &tstruct);
return buf;
}
const std::string currentDate() {
time_t now = time(0);
struct tm tstruct;
char buf[80];
tstruct = *localtime(&now);
strftime(buf, sizeof(buf), "%B %A ", &tstruct);
return buf;
}
int main() {
cout << "\033[2J\033[1;1H";
std:cout << "The current time is " << currentTime() << std::endl;
time_t t = time(0); // get time now
struct tm * now = localtime( & t );
cout << "The current date is " << now->tm_mon + 1 << '-'
<< (now->tm_mday + 1) << '-'
<< (now->tm_year + 1900)
<< " " << currentDate() << endl;
cout << "Day of month is " << (now->tm_mday)
<< " and the Month of year is " << (now->tm_mon)+1 << "," << endl;
cout << "also the day of year is " << (now->tm_yday)
<< " & our Weekday is " << (now->tm_wday) << "." << endl;
cout << "The current year is " << (now->tm_year)+1900 << "."
<< endl;
return 0;
}
Ini dikompilasi untuk saya di Linux (RHEL) dan Windows (x64) yang menargetkan g ++ dan OpenMP:
#include <ctime>
#include <iostream>
#include <string>
#include <locale>
////////////////////////////////////////////////////////////////////////////////
//
// Reports a time-stamped update to the console; format is:
// Name: Update: Year-Month-Day_of_Month Hour:Minute:Second
//
////////////////////////////////////////////////////////////////////////////////
//
// [string] strName : name of the update object
// [string] strUpdate: update descripton
//
////////////////////////////////////////////////////////////////////////////////
void ReportTimeStamp(string strName, string strUpdate)
{
try
{
#ifdef _WIN64
// Current time
const time_t tStart = time(0);
// Current time structure
struct tm tmStart;
localtime_s(&tmStart, &tStart);
// Report
cout << strName << ": " << strUpdate << ": " << (1900 + tmStart.tm_year) << "-" << tmStart.tm_mon << "-" << tmStart.tm_mday << " " << tmStart.tm_hour << ":" << tmStart.tm_min << ":" << tmStart.tm_sec << "\n\n";
#else
// Current time
const time_t tStart = time(0);
// Current time structure
struct tm* tmStart;
tmStart = localtime(&tStart);
// Report
cout << strName << ": " << strUpdate << ": " << (1900 + tmStart->tm_year) << "-" << tmStart->tm_mon << "-" << tmStart->tm_mday << " " << tmStart->tm_hour << ":" << tmStart->tm_min << ":" << tmStart->tm_sec << "\n\n";
#endif
}
catch (exception ex)
{
cout << "ERROR [ReportTimeStamp] Exception Code: " << ex.what() << "\n";
}
return;
}
Anda dapat menggunakan kode berikut untuk mendapatkan tanggal dan waktu sistem saat ini di C ++ :
#include <iostream>
#include <time.h> //It may be #include <ctime> or any other header file depending upon
// compiler or IDE you're using
using namespace std;
int main() {
// current date/time based on current system
time_t now = time(0);
// convert now to string form
string dt = ctime(&now);
cout << "The local date and time is: " << dt << endl;
return 0;
}
PS: Kunjungi situs ini untuk informasi lebih lanjut.
http://www.cplusplus.com/reference/ctime/strftime/
Built-in ini tampaknya menawarkan serangkaian opsi yang masuk akal.
time_t rawTime; time(&rawTime); struct tm *timeInfo; char buf[80]; timeInfo = localtime(&rawTime); strftime(buf, 80, "%T", timeInfo);
Yang satu ini hanya menempatkan HH: MM: SS. Posting pertama saya jadi saya tidak yakin bagaimana cara mendapatkan format kode yang benar. Maaf soal itu.
versi localtime_s ():
#include <stdio.h>
#include <time.h>
int main ()
{
time_t current_time;
struct tm local_time;
time ( ¤t_time );
localtime_s(&local_time, ¤t_time);
int Year = local_time.tm_year + 1900;
int Month = local_time.tm_mon + 1;
int Day = local_time.tm_mday;
int Hour = local_time.tm_hour;
int Min = local_time.tm_min;
int Sec = local_time.tm_sec;
return 0;
}
#include <iostream>
#include <chrono>
#include <string>
#pragma warning(disable: 4996)
// Ver: C++ 17
// IDE: Visual Studio
int main() {
using namespace std;
using namespace chrono;
time_point tp = system_clock::now();
time_t tt = system_clock::to_time_t(tp);
cout << "Current time: " << ctime(&tt) << endl;
return 0;
}
#include <Windows.h>
void main()
{
//Following is a structure to store date / time
SYSTEMTIME SystemTime, LocalTime;
//To get the local time
int loctime = GetLocalTime(&LocalTime);
//To get the system time
int systime = GetSystemTime(&SystemTime)
}
void main
bahkan bukan standar C / C ++.
Anda bisa menggunakan boost
:
#include <boost/date_time/gregorian/gregorian.hpp>
#include <iostream>
using namespace boost::gregorian;
int main()
{
date d = day_clock::universal_day();
std::cout << d.day() << " " << d.month() << " " << d.year();
}