Định dạng ngày giờ ISO-8601 là gì?
Chuỗi ngày giờ ISO-8601 có dạng
- Chẳng hạn như 2016-07-16T19. 20. 30+5. 30 khi múi giờ đi trước UTC
- Chẳng hạn như 2016-07-16T19. 20. 30-01. 00 khi múi giờ chậm hơn UTC
- Chẳng hạn như 2016-07-16T19. 20. 30Z khi múi giờ là UTC
Cũng có thể có trường mili giây, mặc dù trường đó hiếm khi được sử dụng trong thực tế
Javascript có phương thức toISOString cung cấp ngày giờ ở định dạng ISO-8601. Nhưng nó chỉ cung cấp các chuỗi ngày giờ ở định dạng UTC, YYYY-MM-DDTHH. mm. ss. sssZ . Nó không bù múi giờ theo giờ và phút. Để có được điều này, bạn cần một chút mã tùy chỉnh.
Thử nghiệm
1] Bắt Timezone Offset tính bằng Giờ & Phút
Javascript có phương thức getTimezoneOffset cung cấp chênh lệch múi giờ, tính bằng phút, từ giờ địa phương hiện tại sang UTC. Chúng tôi có thể chuyển đổi điều này thành giờ và phút và lấy phần bù múi giờ theo giờ và phút.
Lưu ý rằng getTimezoneOffset trả về giá trị bù dương nếu múi giờ địa phương ở sau UTC và âm nếu múi giờ đó ở trước. Vì vậy, chúng ta phải thêm dấu ngược lại [+ hoặc -] vào phần bù.
var timezone_offset_min = new Date[].getTimezoneOffset[],
offset_hrs = parseInt[Math.abs[timezone_offset_min/60]],
offset_min = Math.abs[timezone_offset_min%60],
timezone_standard;
if[offset_hrs < 10]
offset_hrs = '0' + offset_hrs;
if[offset_min < 10]
offset_min = '0' + offset_min;
// Add an opposite sign to the offset
// If offset is 0, it means timezone is UTC
if[timezone_offset_min < 0]
timezone_standard = '+' + offset_hrs + ':' + offset_min;
else if[timezone_offset_min > 0]
timezone_standard = '-' + offset_hrs + ':' + offset_min;
else if[timezone_offset_min == 0]
timezone_standard = 'Z';
// Timezone difference in hours and minutes
// String such as +5:30 or -6:00 or Z
console.log[timezone_standard];
2] Lấy ngày giờ
Bạn có thể lấy ngày giờ hiện tại bằng cách sử dụng đối tượng Date .
var dt = new Date[],
current_date = dt.getDate[],
current_month = dt.getMonth[] + 1,
current_year = dt.getFullYear[],
current_hrs = dt.getHours[],
current_mins = dt.getMinutes[],
current_secs = dt.getSeconds[],
current_datetime;
// Add 0 before date, month, hrs, mins or secs if they are less than 0
current_date = current_date < 10 ? '0' + current_date : current_date;
current_month = current_month < 10 ? '0' + current_month : current_month;
current_hrs = current_hrs < 10 ? '0' + current_hrs : current_hrs;
current_mins = current_mins < 10 ? '0' + current_mins : current_mins;
current_secs = current_secs < 10 ? '0' + current_secs : current_secs;
// Current datetime
// String such as 2016-07-16T19:20:30
current_datetime = current_year + '-' + current_month + '-' + current_date + 'T' + current_hrs + ':' + current_mins + ':' + current_secs;
Nếu bạn cũng cần mili giây, bạn có thể sử dụng phương thức getMilliseconds .
Nếu bạn muốn chuỗi ngày giờ được đặt thành ngày và giờ khác [không phải thời gian hiện tại], hãy chuyển tham số thích hợp cho Ngày . Xem thêm.
3] Kết hợp cả DateTime và Timezone Offset
Nối phần bù ngày giờ và múi giờ để nhận chuỗi ngày giờ ISO-8601
console.log[current_datetime + timezone_standard];
Sử dụng phương thức toLocaleString[]
để khởi tạo một ngày với múi giờ, e. g. date.toLocaleString['en-US', { timeZone: 'America/Los_Angeles'}]
. Phương thức này có thể được truyền ngôn ngữ và múi giờ dưới dạng tham số và trả về một chuỗi biểu thị ngày theo các giá trị được cung cấp
Đối tượng Date trong JavaScript không lưu trữ múi giờ
Nó lưu dấu thời gian biểu thị số mili giây đã trôi qua kể từ nửa đêm ngày 1 tháng 1 năm 1970
Tuy nhiên, chúng ta có thể sử dụng phương thức toLocaleString để lấy một chuỗi dành riêng cho ngôn ngữ được điều chỉnh theo múi giờ
Hai tham số chúng ta truyền cho phương thức toLocaleString
là
locales
- một chuỗi có thẻ ngôn ngữ BCP 47 hoặc một mảng các chuỗi như vậy. Bạn có thể sử dụng bất kỳ ngôn ngữ nào có sẵn, e. g.es-MX
cho Mexico hoặcen-CA
cho Canada. Nếu bạn cần thêm thông tin về tham số này, hãy xem- Đối tượng
options
nơi chúng tôi đã chỉ định thuộc tính
0. Đọc thêm về đối tượngvar dt = new Date[], current_date = dt.getDate[], current_month = dt.getMonth[] + 1, current_year = dt.getFullYear[], current_hrs = dt.getHours[], current_mins = dt.getMinutes[], current_secs = dt.getSeconds[], current_datetime; // Add 0 before date, month, hrs, mins or secs if they are less than 0 current_date = current_date < 10 ? '0' + current_date : current_date; current_month = current_month < 10 ? '0' + current_month : current_month; current_hrs = current_hrs < 10 ? '0' + current_hrs : current_hrs; current_mins = current_mins < 10 ? '0' + current_mins : current_mins; current_secs = current_secs < 10 ? '0' + current_secs : current_secs; // Current datetime // String such as 2016-07-16T19:20:30 current_datetime = current_year + '-' + current_month + '-' + current_date + 'T' + current_hrs + ':' + current_mins + ':' + current_secs;
options
trong
Bạn có thể tìm thấy bảng mã quốc gia và tên cơ sở dữ liệu múi giờ bằng cách truy cập trang wikipedia này
Ví dụ thứ hai cho thấy cách lấy đối tượng
var dt = new Date[],
current_date = dt.getDate[],
current_month = dt.getMonth[] + 1,
current_year = dt.getFullYear[],
current_hrs = dt.getHours[],
current_mins = dt.getMinutes[],
current_secs = dt.getSeconds[],
current_datetime;
// Add 0 before date, month, hrs, mins or secs if they are less than 0
current_date = current_date < 10 ? '0' + current_date : current_date;
current_month = current_month < 10 ? '0' + current_month : current_month;
current_hrs = current_hrs < 10 ? '0' + current_hrs : current_hrs;
current_mins = current_mins < 10 ? '0' + current_mins : current_mins;
current_secs = current_secs < 10 ? '0' + current_secs : current_secs;
// Current datetime
// String such as 2016-07-16T19:20:30
current_datetime = current_year + '-' + current_month + '-' + current_date + 'T' + current_hrs + ':' + current_mins + ':' + current_secs;
2 có ngày và giờ được đặt theo múi giờ được cung cấpHàm date.toLocaleString['en-US', { timeZone: 'America/Los_Angeles'}]
0 có thể được truyền một đối tượng
var dt = new Date[],
current_date = dt.getDate[],
current_month = dt.getMonth[] + 1,
current_year = dt.getFullYear[],
current_hrs = dt.getHours[],
current_mins = dt.getMinutes[],
current_secs = dt.getSeconds[],
current_datetime;
// Add 0 before date, month, hrs, mins or secs if they are less than 0
current_date = current_date < 10 ? '0' + current_date : current_date;
current_month = current_month < 10 ? '0' + current_month : current_month;
current_hrs = current_hrs < 10 ? '0' + current_hrs : current_hrs;
current_mins = current_mins < 10 ? '0' + current_mins : current_mins;
current_secs = current_secs < 10 ? '0' + current_secs : current_secs;
// Current datetime
// String such as 2016-07-16T19:20:30
current_datetime = current_year + '-' + current_month + '-' + current_date + 'T' + current_hrs + ':' + current_mins + ':' + current_secs;
2 hoặc một chuỗi ngày và trả về một đối tượng var dt = new Date[],
current_date = dt.getDate[],
current_month = dt.getMonth[] + 1,
current_year = dt.getFullYear[],
current_hrs = dt.getHours[],
current_mins = dt.getMinutes[],
current_secs = dt.getSeconds[],
current_datetime;
// Add 0 before date, month, hrs, mins or secs if they are less than 0
current_date = current_date < 10 ? '0' + current_date : current_date;
current_month = current_month < 10 ? '0' + current_month : current_month;
current_hrs = current_hrs < 10 ? '0' + current_hrs : current_hrs;
current_mins = current_mins < 10 ? '0' + current_mins : current_mins;
current_secs = current_secs < 10 ? '0' + current_secs : current_secs;
// Current datetime
// String such as 2016-07-16T19:20:30
current_datetime = current_year + '-' + current_month + '-' + current_date + 'T' + current_hrs + ':' + current_mins + ':' + current_secs;
2 có ngày và giờ của múi giờ được cung cấpTuy nhiên, mặc dù ngày và giờ trong đối tượng ngày tương ứng với múi giờ, nhưng đối tượng
var dt = new Date[],
current_date = dt.getDate[],
current_month = dt.getMonth[] + 1,
current_year = dt.getFullYear[],
current_hrs = dt.getHours[],
current_mins = dt.getMinutes[],
current_secs = dt.getSeconds[],
current_datetime;
// Add 0 before date, month, hrs, mins or secs if they are less than 0
current_date = current_date < 10 ? '0' + current_date : current_date;
current_month = current_month < 10 ? '0' + current_month : current_month;
current_hrs = current_hrs < 10 ? '0' + current_hrs : current_hrs;
current_mins = current_mins < 10 ? '0' + current_mins : current_mins;
current_secs = current_secs < 10 ? '0' + current_secs : current_secs;
// Current datetime
// String such as 2016-07-16T19:20:30
current_datetime = current_year + '-' + current_month + '-' + current_date + 'T' + current_hrs + ':' + current_mins + ':' + current_secs;
2 trong JavaScript không có cách nào lưu trữ múi giờ cụ thểVì lý do này, tốt nhất bạn nên sử dụng phương thức toLocaleString
để lấy chuỗi đại diện cho múi giờ và sử dụng tham số đối tượng options
để định dạng chuỗi theo nhu cầu của bạn
Bạn có thể sử dụng các thuộc tính khác nhau trên đối tượng options
của phương thức toLocaleString
để định dạng ngày và giờ cho múi giờ cụ thể theo nhiều cách khác nhau
Chúng tôi đặt các thuộc tính date.toLocaleString['en-US', { timeZone: 'America/Los_Angeles'}]
8 và date.toLocaleString['en-US', { timeZone: 'America/Los_Angeles'}]
9 trong đối tượng options
thành toLocaleString
1 để có được biểu diễn chi tiết hơn về ngày và giờ
Các giá trị có thể khác cho hai thuộc tính là. toLocaleString
2, toLocaleString
3 và toLocaleString
4
Bạn có thể xem tất cả các thuộc tính và giá trị mà đối tượng options
chứa bằng cách truy cập
Dưới đây là một ví dụ hiển thị tháng, ngày, giờ, phút và giây dưới dạng 2 chữ số, ngay cả khi giá trị của chúng nhỏ hơn toLocaleString
6
Bằng cách đặt giá trị của các thành phần ngày và giờ thành toLocaleString
7 chữ số, chúng tôi định dạng chúng một cách nhất quán, ngay cả khi chúng có giá trị nhỏ hơn toLocaleString
6
Trong trường hợp đó, các giá trị được đệm bằng số 0 đứng đầu
Chúng tôi cũng đặt thuộc tính toLocaleString
9 thành giá trị của toLocaleString
4, để hiển thị tên viết tắt của tên múi giờ ở cuối kết quả
Đối tượng JavaScript
var dt = new Date[],
current_date = dt.getDate[],
current_month = dt.getMonth[] + 1,
current_year = dt.getFullYear[],
current_hrs = dt.getHours[],
current_mins = dt.getMinutes[],
current_secs = dt.getSeconds[],
current_datetime;
// Add 0 before date, month, hrs, mins or secs if they are less than 0
current_date = current_date < 10 ? '0' + current_date : current_date;
current_month = current_month < 10 ? '0' + current_month : current_month;
current_hrs = current_hrs < 10 ? '0' + current_hrs : current_hrs;
current_mins = current_mins < 10 ? '0' + current_mins : current_mins;
current_secs = current_secs < 10 ? '0' + current_secs : current_secs;
// Current datetime
// String such as 2016-07-16T19:20:30
current_datetime = current_year + '-' + current_month + '-' + current_date + 'T' + current_hrs + ':' + current_mins + ':' + current_secs;
2 theo dõi thời gian theo UTC trong nội bộ, nhưng hầu hết các phương thức của nó [ngoại trừ những phương thức có tên UTC] trả về kết quả theo giờ địa phương của khách truy cập [múi giờ máy tính của khách truy cập]Cách tốt nhất là lưu trữ dấu thời gian UTC hoặc chuỗi ISO 8601 trong cơ sở dữ liệu của bạn và sử dụng giờ địa phương khi bạn phải hiển thị ngày và giờ cho người dùng
Một ngoại lệ đối với quy tắc này là, ví dụ: nếu bạn có một doanh nghiệp địa phương và tất cả khách truy cập của bạn đến từ cùng một múi giờ, thì bạn có thể lưu trữ ngày và giờ cụ thể theo múi giờ trong cơ sở dữ liệu của mình