Về mặt ý nghĩa thì đây đều là trường để lưu kiểu dữ liệu ngày tháng, thời gian. Còn mục đích sử dụng thì có thể tóm tắt như sau
1. DẤU THỜI GIAN VÀ DATETIME
TIMESTAMP được sử dụng để theo dõi các thay đổi đối với các bản ghi và cập nhật mỗi khi bản ghi được thay đổi.
DATETIME được sử dụng để lưu trữ giá trị cụ thể và tĩnh không bị ảnh hưởng bởi bất kỳ thay đổi nào.
DẤU THỜI GIAN chịu ảnh hưởng bởi các cài đặt liên quan đến TIME ZONE.
DATETIME thì không chịu ảnh hưởng do cài đặt liên quan đến TIME ZONE.
Giới hạn giá trị lưu dữ liệu kiểu TIMESTAMP. ‘1970-01-01 00. 00. 01 UTC đến’ 2038-01-19 03. 14. 07
Giá trị giới hạn lưu dữ liệu kiểu DATETIME. ‘1000-01-01 00. 00. 00 đến’ 9999-12-31 23. 59. 59
Ví dụ, nếu bạn đang ở Việt Nam, giả sử bạn chèn dữ liệu vào dấu thời gian loại cột có giá trị 1970-01-01 00. 00. 01 thì sẽ nhận được thông báo lỗi ngoài phạm vi lưu dữ liệu, lý do là ở Việt Nam chúng ta có múi giờ UTC +7. 00, should if you save with the data has value 1970-01-01 07. 00. 01 thì sẽ thành công
With DATETIME, range of archive data wide more than more should or used
2. NGÀY GIỜ
NGÀY THÁNG. Loại dữ liệu này chỉ lưu định dạng ngày mà không có thời gian, định dạng YYYY-MM-DD. Phạm vi mà giá trị dữ liệu được lưu nằm trong giới hạn 1000-01-01 đến 9999-12-31
THỜI GIAN. Giá trị lưu giờ phút giây với định dạng HH. MM. SS [hoặc HHH. MM. SS]. Giá trị TIME nằm trong giới hạn -838. 59. 59 đến 838. 59. 59. Đây không phải là kiểu lưu dữ liệu theo ngày nên giá trị không thiết yếu nhất phải nằm trong vòng 24h, chúng ta có thể lưu giá trị ví dụ như. 25. 24. 59[25 giờ 24 phút 59 giây]
Phần này mô tả cài đặt múi giờ được duy trì bởi MySQL, cách tải xuống các bảng hệ thống cần thiết để hỗ trợ thời gian được đặt tên, cách duy trì dòng điện với việc thay đổi múi giờ và cách bật hỗ trợ nhảy bước
Start with MySQL 8. 0. 19, thời gian xoay chiều cũng được hỗ trợ cho các giá trị DateTime được thêm vào; . 2. 2, Ngày Ngày, Ngày giờ và Loại dấu thời gian, để biết thêm thông tin
Để biết thông tin về cài đặt múi giờ trong thiết lập sao chép, xem Phần & NBSP; . 5. 1. 14, chức năng sao chép và hệ thống của Hồi giáo và Phần & NBSP; . 5. 1. 33, Sao chép và múi giờ
Biến đổi khoảng thời gian
Điền vào các vùng giờ
Keep at now with change time
Hỗ trợ nhảy mũi tên thứ hai
Biến đổi khoảng thời gian
Điền vào các vùng giờ
Keep at now with change time
Múi giờ nhảy thứ hai hỗ trợ mysqld . Nếu bạn khởi động máy chủ bằng cách sử dụng mysqld_safe , thì
Tùy chọn
8 cung cấp một cách khác để đặt múi giờ hệ thống. Các giá trị được phép choSET GLOBAL time_zone = timezone;
7 vàSET GLOBAL time_zone = timezone;
8 phụ thuộc vào hệ thống. Tham khảo tài liệu hệ điều hành của bạn để xem giá trị nào được chấp nhậnSET GLOBAL time_zone = timezone;
Máy chủ MySQL duy trì một số cài đặt múi giờ
Host time system. Khi máy chủ khởi động, nó cố gắng xác định múi giờ của máy chủ và sử dụng nó để đặt biến hệ thống
6SET GLOBAL time_zone = timezone;
Để chỉ rõ ràng ràng buộc trong khoảng thời gian hệ thống cho máy chủ MySQL khi khởi động, hãy đặt biến môi trường TZ trước khi bạn khởi động MySQLD. Nếu bạn khởi động máy chủ bằng MySQLD_SAFE, tùy chọn -TimeZone của nó cung cấp một cách khác để đặt múi giờ hệ thống. Các giá trị cho phép đối với TZ và -Timezone phụ thuộc vào hệ thống
Trong bài viết trước, mình đã giới thiệu các bạn những khái niệm cơ bản liên quan đến ngày giờ & múi giờ. Bài viết này mình sẽ phân tích một số vấn đề thường gặp trong thực tế
ResumptionsTrước tiên chúng ta sẽ ôn lại các khái niệm cơ bản
- chốc lát. đối xứng time
- rtime [thời gian tương đối/đại diện]. thời gian tương đối, hoặc cũng có thể gọi là thời gian chỉ để hiển thị
- bù lại. UTC speed
- múi/múi giờ. time
chốc lát
Là một khoảng cụ thể có thể giải thích trong dòng lịch sử
Ví dụ. Khoảng khắc Việt Nam vô địch AFF Cup vào lúc 19. 30 ngày 15/12/2018 tại sân vận động Mỹ Đình, Hà Nội
Khi biểu diễn, cần có đủ hai thành phần. ngày giờ + ngữ cảnh nơi chốn. Ngữ cảnh ở đây chính là múi giờ [vùng]. Các múi giờ được đặc trưng bởi một độ lệch thời gian [bù đắp] vì vậy với giờ phân phối quốc tế UTC. Độ lệch được biểu diễn dưới dạng
8SET GLOBAL time_zone = timezone;
Việt Nam thuộc múi giờ Đông Dương [Indochina Time - ICT] có độ lệch
9SET GLOBAL time_zone = timezone;
Trong máy tính, khoảnh khắc được biểu diễn dưới dạng Epoch Time - số giây trôi qua kể từ 00. 00. 00 ngày 1 tháng 1 năm 1970 theo giờ UTC
thời gian
Thời gian chỉ mang tính hiển thị [thời gian đại diện, gọi tắt là rtime], không kèm theo múi giờ hay độ lệch, không dùng để đối chiếu so sánh
- Tiết học bắt đầu lúc 12h45
- Ca làm việc bắt đầu lúc 15h
- Các ngày lễ, ngày kỷ niệm hằng năm
Khi thêm vùng hoặc bù vào thời gian, chúng ta sẽ có một lúc
moment = rtime + [zone or offset]
Nếu chưa phân biệt được rtime/moment, bạn có thể xem lại bài viết trước
3 Common Unknown Error1. Bạn đã chọn đúng lớp để xử lý?
Lựa chọn nhầm kiểu dữ liệu có thể bắt nguồn từ sự nhầm lẫn giữa rtime và khoảnh khắc - bạn muốn xử lý thời gian dạng rtime nhưng chọn lại kiểu khoảnh khắc và đảo ngược
Chúng ta cùng xem lại danh sách các lớp ngày giờ trong Java tương ứng với 2 loại thời gian
Type timeJava Classrtime[Java 1. 8]
0,moment = rtime + [zone or offset]
1,moment = rtime + [zone or offset]
2thời điểmmoment = rtime + [zone or offset]
3,moment = rtime + [zone or offset]
0System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
[sql]
1,System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
2,System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
3System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
[Java 1. 8]
4,System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
5,System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
6System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
Loại thời gian rtime chỉ mới xuất hiện ở Java 1. 8 - vậy trước đó xử lý kiểu gì?
Nhiều người sẽ nhận ra, trước đây họ không có khái niệm về thời gian hay khoảnh khắc - họ luôn dùng
7 cho mọi trường hợp, nếu có đến múi giờ thì dùngSystem.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
0, nếu có thời gian biểu ngữ lặp đi lặp lại thì dùngSystem.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
9 vàSystem.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
0moment = rtime + [zone or offset]
Để giải quyết vấn đề này, chúng ta phải hiểu bản chất của
7 - bản chất của nó là khoảnh khắc [hiển nhiên rồi, vì nó chứa Epoch Time], nhưng cũng có thể xem nó là rtime, do Java sẽ tự động chuyển đổi về múi giờ của nó.System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
Nhiều người hay nhầm lẫn và không nắm được bản chất của
7, dẫn đến việc vô tình tạo ra lỗi khi hệ thống múi giờ bị thay đổiSystem.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
Với thiết kế của bộ DateTime mới, công việc xử lý thời gian sẽ trở nên chặt chẽ hơn bằng cách đưa ra hệ thống quy chiếu rtime/moment
- Mọi thao tác so sánh đối chiếu thời gian, nên quy tất cả về thời điểm, cụ thể là
4System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
- Muốn tạo một khoảng thời gian cụ thể tại một khoảng thời gian cụ thể [thời điểm], chúng ta bắt đầu từ việc khởi tạo thời gian với
2 [phân tích cú pháp từ chuỗi chuỗi hoặc từ các số ngày, tháng, năm, giờ. tối thiểu. sec], sau đó gắn vào múi giờ đó để tạo ra khoảnh khắcmoment = rtime + [zone or offset]
6. [Xem chi tiết ở bài viết trước]System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
2. Bạn đã chọn đúng lớp để lưu trữ?
Cho dù đã phân biệt được 2 loại thời gian và chọn đúng lớp để thao tác, chúng ta vẫn có khả năng chọn nhầm kiểu lưu trữ bên dưới cơ sở dữ liệu
Trong Java, chúng ta sử dụng JDBC - Java Database Connectivity - một API cho phép hệ thống tương tác với cơ sở dữ liệu. Dưới đây là bảng ánh xạ kiểu dữ liệu tổng hợp của JDBC [Nguồn Oracle]
Loại Java Loại JDBC
3moment = rtime + [zone or offset]
7 [chỉ dành cho Oracle]moment = rtime + [zone or offset]
8 [tất cả các cơ sở dữ liệu khác]moment = rtime + [zone or offset]
1System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
7moment = rtime + [zone or offset]
2System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
2System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
3System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
8moment = rtime + [zone or offset]
"DATE, TIME, TIMESTAMP - ủa cái này quen, hồi đó mình có gặp rồi nè, nhưng mà sao có cảm giác nó không ăn nhập với 2 khái niệm rtime/moment nhỉ?"
Thôi bình tĩnh nhé. Thực hiện nó. but compiles more than as so. Ứng dụng với từng Nhà cung cấp cơ sở dữ liệu [Postgres, MySQL. ], chúng ta phải tuân theo một kiểu ánh xạ khác nhau
Mặc dù vậy, việc đưa ra hệ thống quy chiếu rtime/moment lại tương đối dễ dàng. Chúng ta xem xét 2 ví dụ về Postgres và MySQL
postgres. DẤU THỜI GIAN hay DẤU THỜI GIAN?
Postgres cung cấp 2 loại dấu thời gian là có múi giờ [TIMESTAMPZ] và không có múi giờ [TIMESTAMP]. T liếc nhìn chúng ta sẽ cho rằng dấu thời gian luôn là khoảnh khắc. Tuy nhiên, Hướng dẫn Postgres giải thích
- DẤU THỜI GIAN. when a moment was archive down, Postgres will remove the timezone section and only save the display section [ngày và giờ]. Nếu thay đổi múi giờ của máy chủ cơ sở dữ liệu, giá trị dấu thời gian luôn giữ nguyên không thay đổi
- DẤU THỜI GIAN. là dấu thời gian nhận biết vùng
- Khi một khoảnh khắc được lưu xuống, Postgres sẽ chuyển đổi về giờ UTC và lưu dưới dạng TIMESTAMP ở trên, nghĩa là chỉ lưu phần rtime [ở đây là lý do cả 2 kiểu dữ liệu đều chỉ sử dụng 8 byte bộ nhớ]. Tuy nhiên, nhờ thao tác convert về UTC, nên có thể xem đây là một khoảnh khắc ở múi giờ UTC
- Khi đọc lên, Postgres thực hiện thao tác đảo ngược. giá trị dấu thời gian được chuyển đổi từ UTC về múi giờ của máy chủ cơ sở dữ liệu và trả về cho phụ trợ
- Nói một cách rút gọn, khi lưu xuống ngày-giờ ở múi giờ nào thì đọc lên vẫn là ngày-giờ đó, ở múi giờ đó
Như vậy đã rõ ràng, TIMESTAMP chính là rtime, còn TIMESTAMPZ chính là khoảnh khắc. Tài liệu của Trình điều khiển JDBC cho Postgres được đưa ra ánh xạ bảng như sau
PostgreSQL™Java SE 8DATELocalDateTIMELocalTimeTIMESTAMPLocalDateTimeTIMESTAMPZOffsetDateTimeCó thể thấy, cách ánh xạ kiểu dữ liệu của Postgres hoàn toàn khớp với hệ thống quy chiếu rtime/moment
[ The ta don't used
6 type to mapping TIMESTAMPZ, bySystem.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
6 has contains logic process of Daylight Saving Time - while the chất lượng TIMESTAMPZ does not contain information as such]System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
"If
7 is moment, TIMESTAMP is rtime, vậy tui mapSystem.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
7 with TIMESTAMP thì it save down DB kiểu gì? [Trước giờ tui vẫn hay làm như vậy á]"System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
Như đã giải thích trước đó, chúng ta phải hiểu bản chất của
7System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
- Tại thời điểm lưu xuống,
7 được chuyển đổi về múi giờ của phụ trợ, Postgres chỉ lưu phần rtime [chỉ có ngày giờ]System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
- Khi thời điểm đọc lên, Postgres thực hiện thao tác quay ngược. gắn múi giờ [của phụ trợ] vào dấu thời gian và trả về một thời điểm hoàn chỉnh
"Ủa, vậy sao trước giờ tui sử dụng
7 hoặcSystem.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
3 để ánh xạ TIMESTAMP mà hệ thống của nó vẫn chạy đúng, không bị lỗi?"System.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
Đó là vì múi giờ của máy chủ phụ trợ và cơ sở dữ liệu ở các môi trường LOCAL, DEV và PROD luôn quán nhất với nhau. Vấn đề sẽ phát sinh nếu thay đổi múi giờ và phá vỡ sự quán nhất của hệ thống hiện tại
Bạn có thể tự kiểm tra bằng cách lưu
7 xuống Postgres dưới dạng DẤU THỜI GIAN, sau đó thay đổi múi giờ của phụ trợ rồi đọc lại giá trị đó, chắc chắn sẽ có sự cốSystem.out.println[ZonedDateTime.now[]]; // 2021-08-29T11:05:37.119+07:00[Asia/Bangkok] System.out.println[new Date[]]; // Sun Aug 29 11:05:37 ICT 2021 // Thời gian hiển thị của Date trùng khớp với ZonedDateTime
mysql. Ngày giờ hay Dấu thời gian?
[Lưu ý là Dấu thời gian của MySQL và Postgres không giống nhau]
Tài liệu của mô tả MySQL
Khi lưu Dấu thời gian, giá trị sẽ được chuyển đổi từ múi giờ hiện tại về UTC. Khi đọc lên sẽ đi qua bước lùi. Quy trình này không áp dụng đối với kiểu DateTime
Vì vậy, dễ dàng kết luận, DateTime chính là rtime, còn Timestamp là khoảnh khắc. Tuy nhiên, Trình điều khiển JDBC của MySQL là Trình kết nối/J có sự khác biệt so với Postgres. Để hiểu chính xác cách ánh xạ dữ liệu, bạn có thể tham khảo tài liệu của Connector/J
Thêm nữa, giới hạn lưu trữ của Dấu thời gian trong MySQL là
84, vốn được biết đến với tên gọi Sự cố năm 2038 - Năm 2038 Vấn đề là sự cố xảy ra khi ta lưu khoảnh khắc dưới dạng Thời gian Epoch bằng một số nguyên 32-bit của chúngSET GLOBAL time_zone = timezone;
Thực hành tốt nhất
Đối với thời điểm hiện tại, chúng ta sẽ đi theo hướng dẫn của trình điều khiển JDBC mà chọn kiểu dữ liệu phù hợp [ở phụ trợ cũng như trong cơ sở dữ liệu]
Đối với rtime [thời gian có tính năng lặp lại, ví dụ. time lock biểu tượng, lịch làm việc, ngày lễ kỷ niệm. ], if you don't cover datetime of Java 1. 8 thì tốt nhất nên lưu dạng string vì tính dễ đọc, dễ debug và không gây hiểu lầm. Chúng ta sẽ cần thêm vài bước trung gian để phân tích cú pháp và gắn zone/offset vào, tuy nhiên chuyện đó không tốn nhiều công sức. Nếu không sử dụng chuỗi, thì hãy đảm bảo tuân theo hướng dẫn từ nhà phát triển trình điều khiển JDBC
3. Bạn đang thiết kế giao diện đúng cách?
Vâng, bạn không nghe nhầm đâu. Có phải bạn đã từng thấy một điều khiển chọn ngày giờ như thế này đúng không?
[xdsoft. mạng - plugin jQuery]
Tất nhiên rồi, đây là một biến thiết kế phổ biến, không có vấn đề gì với chiếc datetimepicker này cả
Nhưng mình có một vấn đề. Giả sử chúng ta đang thiết kế một cuộc họp ứng dụng trực tuyến. Để chọn thời gian bắt đầu cuộc họp, chúng ta sử dụng datetimepicker như hình trên. Theo bạn, ngày giờ mà người dùng chọn có đáng tin cậy hay không?
Câu trả lời. hên xui
Phần lớn datetimepicker của thư viện sẽ trả về thời gian dựa trên múi giờ đang được cài đặt trên máy khách. Cố gắng đặt trường hợp người dùng đang sử dụng máy tính thuê của ai đó, với một khoảng thời gian khác. Lúc này bạn sẽ không biết thời gian mà người dùng chọn và gửi về từ frontend có đáng tin cậy hay không
The first power. người dùng không nhận ra sự khác biệt về thời gian. Họ chỉ tin vào những thứ họ nhìn thấy trong ứng dụng. Chắc chắn giá trị ngày giờ sẽ sai lệch
hai chức năng. người dùng nhận ra sự khác biệt giữa các múi giờ trong máy tính họ đang sử dụng. Họ có thể sửa lại múi giờ cho đúng. Nếu không thể sửa đổi [không có quyền hạn], họ sẽ cố gắng quy đổi về đúng giá trị mong muốn. Tuy nhiên, sau tất cả, họ vẫn rối và tự hỏi, "cái thời gian mà mình chọn cuối cuộc là giờ ở đâu nhỉ?"
Giải pháp
Hướng giải quyết của chúng ta rất đơn giản - hãy tham khảo giải pháp của những "ông lớn"
Màn hình tạo cuộc họp của Outlook
Màn hình tạo sự kiện của Facebook
Chúng ta thấy, hệ thống của Outlook phục vụ cho người dùng của toàn cầu, làm việc đó bổ sung vào lựa chọn múi giờ cũng là chuyện dễ hiểu. Còn đối với Facebook, họ chỉ sử dụng loại truyền thống datetimepicker, nhưng kèm theo đó hiển thị rõ ràng giá trị thời gian mà người dùng chọn sẽ thuộc về múi giờ nào [múi giờ của máy tính họ đang sử dụng - như ví dụ trong GMT +
Điểm chung của 2 hướng tiếp giáp này chính là tính chất rõ ràng của thời gian - người dùng sẽ biết cách chọn đúng giá trị mà họ muốn
Đối với những hệ thống chỉ dùng ở một địa phương hoặc một quốc gia, tốt nhất nên theo hướng tiếp cận như Facebook [hiển thị rõ múi giờ cho người dùng], để tránh những hiểu nhầm không mong muốn