Dưới đây là cách thực hiện bằng cách sử dụng Howard Hinnant's date library. Đây là một miễn phí MIT cấp phép C++ 11/14 thư viện dựa trên <chrono>
:
#include "tz.h"
#include <iostream>
int
main()
{
using namespace std::chrono_literals;
using namespace date;
auto unix_timestamp = sys_seconds{1479664467s};
auto zt = make_zoned("America/Los_Angeles", unix_timestamp);
auto wd = weekday{floor<days>(zt.get_local_time())};
std::cout << wd << '\n';
}
Dòng đầu tiên chỉ xây dựng dấu thời gian unix (mà bạn có thể có từ các nguồn khác). Trong C++ 11 chúng tôi không có chrono-literals và do đó dòng này sẽ thay là:
auto unix_timestamp = sys_seconds{seconds{1479664467}};
make_zoned()
tạo ra một zoned_time<seconds>
dựa trên unix_timestamp
và time_zone
"America/Los_Angeles". A zoned_time
là bộ sưu tập của time_zone
và dấu thời gian unix.
Bạn có thể lấy giờ địa phương ở số zoned_time
bằng zt.get_local_time()
. Đây là chrono::time_point
nhưng không có đồng hồ nào được liên kết với nó. Độ chính xác của thời điểm này sẽ bằng với độ chính xác của dấu thời gian ban đầu của bạn (giây trong trường hợp này).
Bạn có thể lấy ngày địa phương trong tuần của local_time
bằng cách cắt xén các local_time
đến một độ chính xác của days
:
floor<days>(zt.get_local_time())
Và đây ngày chính xác time_point
sẽ chuyển đổi thành loại weekday
.
A weekday
có thể được in ra, tham gia weekday
số học và so sánh hoặc được chuyển đổi rõ ràng thành unsigned
trong khoảng [0, 6].
Chương trình
đầu ra ở trên:
Sun
Phần múi giờ của thư viện này là một đại diện trung thành của IANA timezone database. Nó sẽ cung cấp các điều chỉnh chính xác giữa các múi giờ địa phương và UTC như xa trở lại vào giữa những năm 1800 đến hết ngày nay. Nếu bạn vượt qua dấu thời gian của thư viện trước khoảng giữa 1800, giá trị UTC sớm nhất được biết đến sẽ được ngoại suy ngược về năm -32768. Bạn cũng có thể vượt qua dấu thời gian trong tương lai như năm 32767 và các quy tắc tiết kiệm ánh sáng ban ngày và bù trừ hiện tại sẽ được truyền đi về phía trước.
Vì thư viện này được xây dựng trên <chrono>
, nó sẽ xử lý bất kỳ độ chính xác nào mà nguồn cung cấp <chrono>
. Lưu ý rằng một số chrono::duration
s chẳng hạn như nanoseconds
có phạm vi hạn chế hơn (+/- 292 năm cho nanoseconds
).
Thư viện/quy trình là chuỗi an toàn. Tức là, chương trình hoạt động trực tiếp với bất kỳ múi giờ nào bạn chỉ định mà không thay đổi múi giờ hoặc biến môi trường của máy tính của bạn dưới mui xe. Nó cũng không liên quan đến một phần của API định thời C, được biết là không an toàn bởi vì các hàm không thuộc địa phương của hàm const.
Được chuyển đến các phiên bản gcc, clang và VS gần đây.
Tôi không downvote bạn nhưng làm thế nào về ['std :: localtime'] (http://en.cppreference.com/w/cpp/chrono/c/localtime)? – Danh
Cảm ơn bạn - nếu thời gian địa phương không phải là PT cho tôi thì sao? –
[strftime] (http://en.cppreference.com/w/cpp/chrono/c/strftime). Hoặc [time_put] (http://en.cppreference.com/w/cpp/locale/time_put). Hoặc [ngày của Howard Hinnant] (https://github.com/HowardHinnant/date) - con trỏ, không phải là câu trả lời, đây là lý do tại sao một bình luận. –