Có cách nào đa nền tảng để có được ngày giờ hiện tại trong C ++ không?
tm
cấu trúc. Không phải cách tiếp cận C ++ 11 chỉ đưa ra dấu thời gian unix (thời gian kể từ thời đại) mặc dù câu hỏi là về việc lấy ngày và giờ?
Có cách nào đa nền tảng để có được ngày giờ hiện tại trong C ++ không?
tm
cấu trúc. Không phải cách tiếp cận C ++ 11 chỉ đưa ra dấu thời gian unix (thời gian kể từ thời đại) mặc dù câu hỏi là về việc lấy ngày và giờ?
Câu trả lời:
Trong C ++ 11 bạn có thể sử dụng std::chrono::system_clock::now()
Ví dụ (được sao chép từ 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";
}
Điều này sẽ in một cái gì đó như thế này:
finished computation at Mon Oct 2 00:59:08 2017
elapsed time: 1.88232s
string
từ stream
hoặc định dạng đúng a time_point<>
, hãy tiếp tục và đặt câu hỏi khác hoặc google sau nó.
C ++ chia sẻ các chức năng ngày / giờ của nó với C. Cấu trúc tm có lẽ là dễ nhất để lập trình viên C ++ làm việc với - các bản in sau đây ngày hôm nay:
#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()
cùng với câu trả lời này nếu bạn muốn một chuỗi ngày.
struct tm
thì có thể gọi xóa trên đó không?
delete
(từ khóa c ++) trên đó, tôi chỉ nghĩ rằng nó nên được xóa bằng cách nào đó :) hoặc ai sẽ làm điều đó cho bạn?
Bạn có thể thử mã đa nền tảng sau đây để có được ngày / giờ hiện tại:
#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
}
Đầu ra:
currentDateTime()=2012-05-06.21:47:59
Vui lòng truy cập vào đây để biết thêm thông tin về định dạng ngày / giờ
const
giá trị? Điều đó là vô mục đích.
thư viện std C cung cấp time()
. Đây là vài giây từ kỷ nguyên và có thể được chuyển đổi thành ngày và H:M:S
sử dụng các chức năng C tiêu chuẩn. Boost cũng có một thư viện thời gian / ngày mà bạn có thể kiểm tra.
time_t timev;
time(&timev);
thư viện chuẩn C ++ không cung cấp loại ngày thích hợp. C ++ kế thừa các cấu trúc và chức năng để thao tác ngày và giờ từ C, cùng với một vài hàm đầu vào và đầu ra ngày / giờ có tính đến nội địa hóa.
// 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;
}
Câu trả lời mới cho một câu hỏi cũ:
Câu hỏi không chỉ định trong múi giờ nào. Có hai khả năng hợp lý:
Đối với 1, bạn có thể sử dụng thư viện ngày này và chương trình sau:
#include "date.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
std::cout << system_clock::now() << '\n';
}
Mà chỉ là đầu ra cho tôi:
2015-08-18 22:08:18.944211
Thư viện ngày về cơ bản chỉ cần thêm một toán tử phát trực tuyến cho std::chrono::system_clock::time_point
. Nó cũng bổ sung rất nhiều chức năng hay khác, nhưng điều đó không được sử dụng trong chương trình đơn giản này.
Nếu bạn thích 2 (giờ địa phương), có một thư viện múi giờ được xây dựng trên đầu thư viện ngày . Cả hai thư viện này đều là mã nguồn mở và đa nền tảng , giả sử trình biên dịch hỗ trợ C ++ 11 hoặc 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';
}
Mà đối với tôi chỉ là đầu ra:
2015-08-18 18:08:18.944211 EDT
Loại kết quả từ make_zoned
là một date::zoned_time
mà là một cặp đôi của một date::time_zone
và một std::chrono::system_clock::time_point
. Cặp này đại diện cho giờ địa phương, nhưng cũng có thể đại diện cho UTC, tùy thuộc vào cách bạn truy vấn nó.
Với đầu ra ở trên, bạn có thể thấy rằng máy tính của tôi hiện đang ở múi giờ với độ lệch UTC là -4h và viết tắt là EDT.
Nếu một số múi giờ khác là mong muốn, điều đó cũng có thể được thực hiện. Ví dụ: để tìm thời gian hiện tại ở Sydney, Úc, chỉ cần thay đổi cấu trúc của biến local
thành:
auto local = make_zoned("Australia/Sydney", system_clock::now());
Và đầu ra thay đổi thành:
2015-08-19 08:08:18.944211 AEST
Thư viện này hiện được áp dụng chủ yếu cho C ++ 20. Không gian tên date
đã biến mất và mọi thứ đều nằm trong không gian tên std::chrono
. Và sử dụng zoned_time
thay thế make_time
. Thả các tiêu đề "date.h"
và "tz.h"
và chỉ cần sử dụng <chrono>
.
Khi tôi viết điều này, việc triển khai một phần mới bắt đầu xuất hiện trên một số nền tảng.
localtime
cho tôi thời gian trong múi giờ của tôi?
localtime
sẽ luôn cung cấp cho bạn thời gian trong múi giờ địa phương của bạn đến độ chính xác thứ hai. Đôi khi nó sẽ thất bại vì các vấn đề an toàn chủ đề, và nó sẽ không bao giờ hoạt động cho độ chính xác thứ hai.
(Dành cho các nhân viên của Google)
Ngoài ra còn có 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.
Nhận thời gian hiện tại bằng cách sử dụng std::time()
hoặc std::chrono::system_clock::now()
(hoặc loại đồng hồ khác ).
std::put_time()
(C ++ 11) và strftime()
(C) cung cấp rất nhiều trình định dạng để xuất ra những lần đó.
#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");
}
Trình tự của các trình định dạng có vấn đề:
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
Các định dạng strftime()
tương tự nhau:
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
}
Thông thường, trình định dạng viết hoa có nghĩa là "phiên bản đầy đủ" và chữ thường có nghĩa là viết tắt (ví dụ: Y: 2017, y: 17).
Cài đặt ngôn ngữ thay đổi đầu ra:
#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");
}
Đầu ra có thể ( 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
Tôi đã sử dụng std::gmtime()
để chuyển đổi sang UTC. std::localtime()
được cung cấp để chuyển đổi sang giờ địa phương.
Lưu ý rằng asctime()
/ ctime()
đã được đề cập trong các câu trả lời khác được đánh dấu là không dùng nữa và strftime()
nên được ưu tiên.
Có và bạn có thể làm như vậy với các quy tắc định dạng được chỉ định bởi miền địa phương hiện tại:
#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");
}
Đầu ra:
Fri Sep 6 20:33:31 2013
ostream::sentry
điều đó thường xuyên).
Luôn có __TIMESTAMP__
macro tiền xử lý.
#include <iostream>
using namespace std
void printBuildDateTime () {
cout << __TIMESTAMP__ << endl;
}
int main() {
printBuildDateTime();
}
ví dụ: CN ngày 13 tháng 4 11:28:08 2014
__TIMESTAMP__
là một macro tiền xử lý mở rộng đến thời điểm hiện tại (tại thời gian biên dịch) ở dạng Ddd Mmm Ngày hh :: mm :: ss yyyy. Các __TIMESTAMP__
vĩ mô có thể được sử dụng để cung cấp thông tin về thời điểm cụ thể một số nhị phân được xây dựng. Tham khảo: cprogramming.com/reference/pre Processor / _TIMESTAMP__.html
Bạn cũng có thể trực tiếp sử dụng 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
trước khi đưa vào để biên dịch chương trình
Tôi thấy liên kết này khá hữu ích cho việc triển khai của mình: Ngày và giờ C ++
Đây là mã tôi sử dụng trong quá trình triển khai của mình, để có được định dạng đầu ra "YYYYMMDD HHMMSS" rõ ràng. Thông số trong là để chuyển đổi giữa UTC và giờ địa phương. Bạn có thể dễ dàng sửa đổi mã của tôi để phù hợp với nhu cầu của bạn.
#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();
}
Đầu ra (UTC, EST):
20161123 000454
20161122 190454
ptmNow->tm_day < 9
và không <10
?
<=9
vì bạn muốn bao gồm cả 9.
1+
trong mã. Ngày / Tháng bắt đầu từ 0.
Điều này hoạt động với G ++ Tôi không chắc chắn nếu điều này giúp bạn. Đầu ra chương trình:
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.
Mã số:
#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;
}
Điều này được biên dịch cho tôi trên Linux (RHEL) và Windows (x64) nhắm mục tiêu g ++ và 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;
}
Bạn có thể sử dụng đoạn mã sau để lấy ngày và giờ hệ thống hiện tại trong 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: Truy cập trang web này để biết thêm thông tin.
http://www.cplusplus.com/reference/ctime/strftime/
Tích hợp này dường như cung cấp một bộ tùy chọn hợp lý.
time_t rawTime; time(&rawTime); struct tm *timeInfo; char buf[80]; timeInfo = localtime(&rawTime); strftime(buf, 80, "%T", timeInfo);
Điều này đặc biệt chỉ đặt HH: MM: SS. Bài viết đầu tiên của tôi vì vậy tôi không chắc làm thế nào để có được định dạng mã chính xác. Xin lỗi vì điều đó.
phiên bản 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
thậm chí không phải là C / C ++ tiêu chuẩn.
Bạn có thể sử dụng 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();
}