Định dạng thời gian trong javascript là gì?

Thao tác ngày giờ nổi tiếng là khó. Các nhà phát triển gặp phải quy tắc múi giờ, giây nhảy vọt, sự khác biệt về định dạng dành riêng cho ngôn ngữ nên sử dụng các thư viện thao tác ngày và giờ phổ biến. Nhưng không cần suy nghĩ về cách chúng hoạt động chính xác, vẫn dễ dàng tạo ra đủ loại lỗi khó hiểu

Qua

Trừng phạt Jajodia

Punit là một kỹ sư phần mềm và doanh nhân đa năng. Anh ấy đã làm việc về dữ liệu lớn và mô phỏng 3D thời gian thực và là một chuyên gia về MEAN stack

CHIA SẺ

CHIA SẺ

Là một nhà phát triển phần mềm, bạn không thể thoát khỏi việc thao túng ngày tháng. Hầu hết mọi ứng dụng mà nhà phát triển xây dựng sẽ có một số thành phần mà ngày/giờ cần được lấy từ người dùng, được lưu trữ trong cơ sở dữ liệu và hiển thị lại cho người dùng

Hỏi bất kỳ lập trình viên nào về kinh nghiệm xử lý ngày và múi giờ của họ và họ có thể sẽ chia sẻ một số câu chuyện chiến tranh. Xử lý các trường ngày và giờ chắc chắn không phải là khoa học tên lửa nhưng thường có thể tẻ nhạt và dễ bị lỗi

Có hàng trăm bài viết về chủ đề này, tuy nhiên, hầu hết đều quá hàn lâm, tập trung vào các chi tiết nhỏ nhặt hoặc chúng quá chắp vá, cung cấp các đoạn mã ngắn mà không có nhiều giải thích kèm theo. Hướng dẫn chuyên sâu về thao tác DateTime này sẽ giúp bạn hiểu các khái niệm lập trình và các phương pháp hay nhất liên quan đến thời gian và ngày tháng mà không cần phải duyệt qua một biển thông tin về chủ đề này

Trong bài viết này, tôi sẽ giúp bạn suy nghĩ rõ ràng về các trường ngày và giờ, đồng thời đề xuất một số phương pháp hay nhất có thể giúp bạn tránh được địa ngục ngày/giờ. Ở đây chúng ta sẽ khám phá một số khái niệm chính cần thiết để thao tác chính xác các giá trị ngày và giờ, các định dạng thuận tiện cho việc lưu trữ các giá trị DateTime và chuyển chúng qua API, v.v.

Đối với những người mới bắt đầu, câu trả lời đúng cho mã sản xuất hầu như luôn là sử dụng một thư viện phù hợp thay vì tạo mã của riêng bạn. Những khó khăn tiềm ẩn với phép tính DateTime được thảo luận trong bài viết này chỉ là phần nổi của tảng băng trôi, nhưng chúng vẫn hữu ích khi biết về việc có hoặc không có thư viện

Thư viện DateTime Trợ giúp nếu bạn hiểu đúng về chúng

Thư viện ngày giúp theo nhiều cách để làm cho cuộc sống của bạn dễ dàng hơn. Chúng đơn giản hóa rất nhiều việc phân tích ngày tháng, các phép toán logic và số học ngày tháng cũng như định dạng ngày tháng. Bạn có thể tìm thấy một thư viện ngày đáng tin cậy cho cả giao diện người dùng và giao diện người dùng để thực hiện hầu hết các công việc nặng nhọc cho bạn

Tuy nhiên, chúng ta thường sử dụng thư viện ngày tháng mà không suy nghĩ về cách thức hoạt động của ngày/giờ. Ngày/giờ là một khái niệm phức tạp. Các lỗi phát sinh do hiểu sai về nó có thể cực kỳ khó hiểu và khó khắc phục, ngay cả khi có sự trợ giúp của thư viện ngày tháng. Là một lập trình viên, bạn cần hiểu những kiến ​​thức cơ bản và có thể đánh giá đúng các vấn đề mà thư viện ngày tháng giải quyết để tận dụng tối đa chúng

Ngoài ra, thư viện ngày/giờ chỉ có thể đưa bạn đến nay. Tất cả các thư viện ngày hoạt động bằng cách cấp cho bạn quyền truy cập vào các cấu trúc dữ liệu thuận tiện để biểu thị Ngày giờ. Nếu bạn đang gửi và nhận dữ liệu thông qua API REST, cuối cùng bạn sẽ cần chuyển đổi ngày thành chuỗi và ngược lại vì JSON không có cấu trúc dữ liệu riêng để biểu thị DateTime. Các khái niệm mà tôi đã phác thảo ở đây sẽ giúp bạn tránh được một số vấn đề phổ biến có thể xảy ra khi thực hiện các phép biến đổi từ ngày này sang chuỗi khác và từ chuỗi này sang ngày khác

Ghi chú. Mặc dù tôi đã sử dụng JavaScript làm ngôn ngữ lập trình được thảo luận trong bài viết này, nhưng đây là những khái niệm chung được áp dụng ở mức độ lớn cho hầu như tất cả các ngôn ngữ lập trình và thư viện ngày tháng của chúng. Vì vậy, ngay cả khi bạn chưa từng viết một dòng JavaScript nào trước đây, hãy tiếp tục đọc vì tôi hầu như không cho rằng có bất kỳ kiến ​​thức nào về JavaScript trước đó trong bài viết

Chuẩn hóa thời gian

DateTime là một thời điểm rất cụ thể. Hãy nghĩ về điều này. Khi tôi viết nguệch ngoạc bài viết này, đồng hồ trên máy tính xách tay của tôi hiển thị ngày 21 tháng 7 1. 29 giờ tối. Đây là cái mà chúng tôi gọi là “giờ địa phương”, thời gian mà tôi nhìn thấy trên đồng hồ treo tường xung quanh mình và trên đồng hồ đeo tay của tôi

Cho hoặc mất vài phút, nếu tôi hẹn bạn tôi ở một quán cà phê gần đó lúc 3 giờ. 00 PM, tôi có thể mong gặp cô ấy ở đó vào khoảng thời gian đó. Tương tự như vậy, sẽ không có bất kỳ sự nhầm lẫn nào nếu thay vào đó tôi nói, chẳng hạn như “hãy gặp nhau sau một tiếng rưỡi nữa. ” Chúng tôi thường nói về thời gian theo cách này với những người sống trong cùng thành phố hoặc múi giờ

Hãy nghĩ về một kịch bản khác. Tôi muốn nói với một người bạn sống ở Uppsala, Thụy Điển rằng tôi muốn nói chuyện với anh ấy lúc 5 giờ chiều. Tôi gửi cho anh ấy một tin nhắn, “Này Anton, hãy nói chuyện lúc 5 giờ chiều. ” Tôi ngay lập tức nhận được câu trả lời, “Thời gian của bạn hay thời gian của tôi?”

Anton nói với tôi rằng anh ấy sống ở múi giờ Trung Âu là UTC+01. 00. Tôi sống ở UTC+05. 45. Điều này có nghĩa là khi ở nơi tôi sống là 5 giờ chiều thì đó là 5 giờ chiều - 05. 45 = 11. 15 AM UTC, có nghĩa là 11. 15 giờ sáng UTC + 01. 00 = 12. 15 giờ chiều ở Uppsala, hoàn hảo cho cả hai chúng tôi

Ngoài ra, hãy lưu ý về sự khác biệt giữa múi giờ [Giờ Trung Âu] và độ lệch múi giờ [UTC+05. 45]. Các quốc gia cũng có thể quyết định thay đổi độ lệch múi giờ của họ đối với Giờ tiết kiệm ánh sáng ban ngày vì lý do chính trị. Hầu như mỗi năm đều có sự thay đổi đối với các quy tắc ở ít nhất một quốc gia, nghĩa là bất kỳ mã nào có các quy tắc này đều phải được cập nhật—bạn nên xem xét cơ sở mã của mình phụ thuộc vào điều này cho từng cấp ứng dụng của bạn

Đó là một lý do chính đáng khác mà chúng tôi khuyên rằng chỉ giao diện người dùng mới xử lý các múi giờ trong hầu hết các trường hợp. Khi không, điều gì sẽ xảy ra khi các quy tắc mà công cụ cơ sở dữ liệu của bạn sử dụng không khớp với các quy tắc của mặt trước hoặc mặt sau của bạn?

Vấn đề quản lý hai phiên bản thời gian khác nhau, liên quan đến người dùng và liên quan đến một tiêu chuẩn được chấp nhận rộng rãi, rất khó, thậm chí còn khó hơn trong thế giới lập trình nơi độ chính xác là chìa khóa và thậm chí một giây cũng có thể tạo ra sự khác biệt lớn. Bước đầu tiên để giải quyết những vấn đề này là lưu trữ DateTime theo UTC

Chuẩn hóa định dạng

Chuẩn hóa thời gian thật tuyệt vời vì tôi chỉ cần lưu trữ thời gian UTC và miễn là tôi biết múi giờ của người dùng, tôi luôn có thể chuyển đổi sang thời gian của họ. Ngược lại, nếu tôi biết giờ địa phương của người dùng và biết múi giờ của họ, tôi có thể chuyển đổi giờ đó thành UTC

Nhưng ngày và giờ có thể được chỉ định ở nhiều định dạng khác nhau. Đối với ngày, bạn có thể viết “Jul 30th” hoặc “30 July” hoặc “7/30” [hoặc 30/7, tùy thuộc vào nơi bạn sống]. Tạm thời, bạn có thể viết “9. 30 giờ tối” hoặc “21 giờ 30”

Các nhà khoa học trên toàn thế giới đã cùng nhau giải quyết vấn đề này và quyết định một định dạng để mô tả thời gian mà các lập trình viên thực sự thích vì nó ngắn và chính xác. Chúng tôi muốn gọi nó là “Định dạng ngày ISO”, đây là phiên bản đơn giản hóa của định dạng mở rộng ISO-8601 và nó trông như thế này

Cho 00. 00 hoặc UTC, thay vào đó, chúng tôi sử dụng “Z”, có nghĩa là giờ Zulu, tên gọi khác của UTC

Thao tác ngày tháng và số học trong JavaScript

Trước khi bắt đầu với các phương pháp hay nhất, chúng ta sẽ tìm hiểu về thao tác ngày tháng bằng JavaScript để nắm bắt cú pháp và các khái niệm chung. Mặc dù chúng tôi sử dụng JavaScript, nhưng bạn có thể dễ dàng điều chỉnh thông tin này sang ngôn ngữ lập trình yêu thích của mình

Chúng tôi sẽ sử dụng số học ngày tháng để giải quyết các vấn đề phổ biến liên quan đến ngày tháng mà hầu hết các nhà phát triển đều gặp phải

Mục tiêu của tôi là giúp bạn thoải mái tạo đối tượng ngày tháng từ một chuỗi và trích xuất các thành phần từ một chuỗi. Đây là điều mà thư viện ngày tháng có thể giúp bạn, nhưng tốt hơn hết bạn nên hiểu cách nó được thực hiện đằng sau hậu trường

Khi chúng ta đã hiểu rõ về ngày/giờ, thì sẽ dễ dàng hơn để suy nghĩ về các vấn đề mà chúng ta gặp phải, rút ​​ra các phương pháp hay nhất và tiến lên phía trước. Nếu bạn muốn bỏ qua các phương pháp hay nhất, vui lòng làm như vậy, nhưng tôi thực sự khuyên bạn ít nhất nên đọc lướt qua phần số học ngày tháng bên dưới

Đối tượng ngày JavaScript

Ngôn ngữ lập trình chứa các cấu trúc hữu ích giúp cuộc sống của chúng ta dễ dàng hơn. Đối tượng JavaScript

const date = new Date[2016, 6, 27, 13, 30, 0];
9 là một thứ như vậy. Nó cung cấp các phương thức thuận tiện để lấy ngày và giờ hiện tại, lưu trữ ngày trong một biến, thực hiện phép tính ngày và định dạng ngày dựa trên ngôn ngữ của người dùng

Do sự khác biệt giữa việc triển khai trình duyệt và việc xử lý Giờ tiết kiệm ánh sáng ban ngày [DST] không chính xác, việc tùy thuộc vào đối tượng Ngày cho các ứng dụng quan trọng không được khuyến nghị và có lẽ bạn nên sử dụng thư viện DateTime như. [Dù bạn sử dụng cái gì, hãy tránh Khoảnh khắc nổi tiếng một thời. js—thường được gọi đơn giản là

const date = new Date["2016-07-27T07:45:00Z"];
0, như nó xuất hiện trong mã—vì nó hiện không được dùng nữa. ]

Nhưng với mục đích giáo dục, chúng ta sẽ sử dụng các phương thức mà đối tượng Date[] cung cấp để tìm hiểu cách JavaScript xử lý DateTime

Nhận ngày hiện tại

const currentDate = new Date[];

Nếu bạn không truyền bất cứ thứ gì vào hàm tạo Ngày, đối tượng ngày được trả về chứa ngày và giờ hiện tại

Sau đó, bạn có thể định dạng nó để chỉ trích xuất phần ngày tháng như sau

const currentDate = new Date[];

const currentDayOfMonth = currentDate.getDate[];
const currentMonth = currentDate.getMonth[]; // Be careful! January is 0, not 1
const currentYear = currentDate.getFullYear[];

const dateString = currentDayOfMonth + "-" + [currentMonth + 1] + "-" + currentYear;
// "27-11-2020"

Ghi chú. Cạm bẫy “Tháng Giêng là 0” phổ biến nhưng không phổ biến. Cần kiểm tra kỹ tài liệu của bất kỳ ngôn ngữ nào [hoặc định dạng cấu hình. e. g. , cron đáng chú ý là dựa trên 1] trước khi bạn bắt đầu sử dụng nó

Lấy dấu thời gian hiện tại

Thay vào đó, nếu bạn muốn lấy dấu thời gian hiện tại, bạn có thể tạo một đối tượng Date mới và sử dụng phương thức getTime[]

const currentDate = new Date[];
const timestamp = currentDate.getTime[];

Trong JavaScript, dấu thời gian là số mili giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970

Nếu bạn không có ý định hỗ trợ

Chủ Đề