Đị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

An image showing a simplified version of the ISO-8601 extended format called the ISO date format.

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ợ const date = new Date("2016-07-27T07:45:00Z"); 1 để trực tiếp lấy dấu thời gian mà không phải tạo đối tượng Ngày mới

Phân tích một ngày

Chuyển đổi một chuỗi thành một đối tượng ngày JavaScript được thực hiện theo nhiều cách khác nhau

Hàm tạo của đối tượng Date chấp nhận nhiều định dạng ngày khác nhau

const date1 = new Date("Wed, 27 July 2016 13:30:00");
const date2 = new Date("Wed, 27 July 2016 07:45:00 UTC");
const date3 = new Date("27 July 2016 13:30:00 UTC+05:45");

Lưu ý rằng bạn không cần bao gồm ngày trong tuần vì JS có thể xác định ngày trong tuần cho bất kỳ ngày nào

Bạn cũng có thể chuyển năm, tháng, ngày, giờ, phút và giây dưới dạng các đối số riêng biệt

const date = new Date(2016, 6, 27, 13, 30, 0);

Tất nhiên, bạn luôn có thể sử dụng định dạng ngày ISO

const date = new Date("2016-07-27T07:45:00Z");

Tuy nhiên, bạn có thể gặp rắc rối khi không cung cấp múi giờ một cách rõ ràng

const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");

Một trong hai sẽ cung cấp cho bạn 25 Tháng bảy 2016 00. 00. 00 giờ địa phương

Nếu bạn sử dụng định dạng ISO, ngay cả khi bạn chỉ cung cấp ngày chứ không phải thời gian và múi giờ, nó sẽ tự động chấp nhận múi giờ là UTC

Điều này có nghĩa rằng

const date = new Date("2016-07-27T07:45:00Z");
0

Định dạng một ngày

May mắn thay, JavaScript hiện đại có một số chức năng quốc tế hóa thuận tiện được tích hợp trong không gian tên

const date = new Date("2016-07-27T07:45:00Z");
2 tiêu chuẩn giúp cho việc định dạng ngày trở thành một thao tác đơn giản

Đối với điều này, chúng ta sẽ cần hai đối tượng. một

const date = new Date(2016, 6, 27, 13, 30, 0);
9 và một
const date = new Date("2016-07-27T07:45:00Z");
4, được khởi tạo với tùy chọn đầu ra của chúng tôi. Giả sử chúng tôi muốn sử dụng định dạng của Mỹ (M/D/YYYY), điều này sẽ giống như

const date = new Date("2016-07-27T07:45:00Z");
4

Thay vào đó, nếu chúng tôi muốn định dạng tiếng Hà Lan (D/M/YYYY), chúng tôi sẽ chỉ chuyển một mã văn hóa khác cho hàm tạo

const date = new Date("2016-07-27T07:45:00Z");
5

const date = new Date("2016-07-27T07:45:00Z");
6

Hoặc dạng dài hơn của định dạng Mỹ, với tên tháng được đánh vần

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"
0

Bây giờ, nếu chúng ta muốn có một định dạng thứ tự phù hợp vào ngày trong tháng—tức là, “ngày 14” thay vì chỉ “14”—điều này rất tiếc cần một chút giải pháp thay thế, bởi vì các giá trị hợp lệ duy nhất của

const date = new Date("2016-07-27T07:45:00Z");
6 tại thời điểm viết bài này là
const date = new Date("2016-07-27T07:45:00Z");
7 hoặc . Mượn phiên bản mã Mathias Bynens của Flavio Copes để tận dụng một phần khác của
const date = new Date("2016-07-27T07:45:00Z");
2 cho việc này, chúng tôi có thể tùy chỉnh đầu ra ngày trong tháng thông qua
const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
0

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"
1

Thật không may,

const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
1 hoàn toàn không được Internet Explorer (IE) hỗ trợ khi viết bài này, nhưng tất cả các máy tính để bàn, thiết bị di động và phụ trợ khác (i. e. Nút. js) có hỗ trợ. Đối với những người cần hỗ trợ IE và hoàn toàn cần các thứ tự, chú thích bên dưới (hoặc tốt hơn là thư viện ngày thích hợp) cung cấp câu trả lời

Nếu bạn cần hỗ trợ các trình duyệt cũ hơn như IE trước phiên bản 11, thì việc định dạng ngày tháng trong JavaScript sẽ khó khăn hơn vì không có các hàm định dạng ngày tháng tiêu chuẩn như

const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
2 trong Python hoặc PHP

Ví dụ, trong PHP, hàm

const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
3 cung cấp cho bạn
const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
4

Bạn có thể sử dụng một tổ hợp các chữ cái khác trước

const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
5 để lấy ngày ở các định dạng khác nhau. (Cẩn thận, không phải ngôn ngữ nào cũng gán nghĩa giống nhau cho từng chữ cái—đặc biệt, 'M' và 'm' có thể hoán đổi cho nhau trong nhiều phút và nhiều tháng. )

Nếu bạn chắc chắn về định dạng mình muốn sử dụng, tốt nhất là trích xuất các bit riêng lẻ bằng cách sử dụng các hàm JavaScript mà chúng tôi đã trình bày ở trên và tự tạo một chuỗi

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"
2

Chúng tôi có thể lấy ngày ở định dạng MM/DD/YYYY như

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"
3

Vấn đề với giải pháp này là nó có thể đưa ra độ dài không nhất quán cho các ngày vì một số tháng và ngày trong tháng là một chữ số và một số khác là hai chữ số. Điều này có thể có vấn đề, ví dụ: nếu bạn đang hiển thị ngày trong cột của bảng vì ngày không thẳng hàng

Chúng ta có thể giải quyết vấn đề này bằng cách sử dụng hàm “pad” có thêm số 0 ở đầu

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"
4

Bây giờ, chúng tôi nhận được ngày chính xác ở định dạng MM/DD/YYYY bằng cách sử dụng

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"
5

Thay vào đó, nếu chúng tôi muốn DD-MM-YYYY, quá trình này tương tự

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"
6

Hãy bắt đầu và thử in ngày ở định dạng “Tháng Ngày, Năm”. Chúng tôi sẽ cần ánh xạ các chỉ mục tháng tới các tên

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"
7

Một số người thích hiển thị ngày là ngày 1 tháng 1 năm 2013. Không thành vấn đề, tất cả những gì chúng ta cần là một hàm trợ giúp

const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
6 trả về thứ nhất cho 1, thứ 12 cho 12 và thứ 103 cho 103, v.v. , và phần còn lại là đơn giản

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"
8

Thật dễ dàng để xác định ngày trong tuần từ đối tượng ngày, vì vậy hãy thêm nó vào

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"
9

Điểm quan trọng hơn ở đây là, khi bạn đã lấy được các số được trích xuất từ ​​ngày, định dạng chủ yếu liên quan đến chuỗi

Thay đổi định dạng ngày

Một khi bạn biết cách phân tích một ngày và định dạng nó, việc thay đổi một ngày từ định dạng này sang định dạng khác chỉ là vấn đề kết hợp cả hai.

Ví dụ: nếu bạn có một ngày ở định dạng ngày 21 tháng 7 năm 2013 và muốn thay đổi định dạng thành ngày 21-07-2013, bạn có thể thực hiện như sau

const currentDate = new Date();
const timestamp = currentDate.getTime();
0

Sử dụng các chức năng bản địa hóa đối tượng ngày của JavaScript

Các phương thức định dạng ngày mà chúng ta đã thảo luận ở trên sẽ hoạt động trong hầu hết các ứng dụng, nhưng nếu bạn thực sự muốn bản địa hóa định dạng ngày, tôi khuyên bạn nên sử dụng phương thức

const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
8 của đối tượng
const date = new Date(2016, 6, 27, 13, 30, 0);
9

const currentDate = new Date();
const timestamp = currentDate.getTime();
1

…cung cấp cho chúng tôi một cái gì đó như

const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
9

Thay đổi ngôn ngữ thành 'en-US' sẽ cho "26 tháng 7 năm 2016" để thay thế. Lưu ý cách định dạng đã thay đổi, nhưng các tùy chọn hiển thị vẫn được giữ nguyên—một tính năng rất hữu ích. Như đã trình bày trong phần trước, kỹ thuật dựa trên

const date = new Date("2016-07-27T07:45:00Z");
4 mới hơn hoạt động rất giống với kỹ thuật này, nhưng cho phép bạn sử dụng lại một đối tượng định dạng để bạn chỉ cần đặt các tùy chọn một lần

Với

const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
8, thói quen tốt là luôn chuyển các tùy chọn định dạng, ngay cả khi đầu ra trông ổn trên máy tính của bạn. Điều này có thể bảo vệ giao diện người dùng khỏi bị phá vỡ ở các ngôn ngữ không mong muốn với tên tháng thực sự dài hoặc trông khó xử vì tên ngắn

Thay vào đó, nếu tôi muốn cả tháng “Tháng 7”, tất cả những gì tôi làm là thay đổi tham số tháng trong các tùy chọn thành “dài hạn”. JavaScript xử lý mọi thứ cho tôi. Đối với en-US, bây giờ tôi nhận được ngày 26 tháng 7 năm 2016

Ghi chú. Nếu bạn muốn trình duyệt tự động sử dụng ngôn ngữ của người dùng, bạn có thể chuyển "không xác định" làm tham số đầu tiên

Nếu bạn muốn hiển thị phiên bản số của ngày và không muốn phiền phức với MM/DD/YYYY so với. DD/MM/YYYY cho các ngôn ngữ khác nhau, tôi đề xuất giải pháp đơn giản sau

const currentDate = new Date();
const timestamp = currentDate.getTime();
2

Trên máy tính của tôi, kết quả này là

const date = new Date("2016-07-27T07:45:00Z");
02. Nếu bạn muốn chắc chắn rằng tháng và ngày có hai chữ số, chỉ cần thay đổi các tùy chọn

const currentDate = new Date();
const timestamp = currentDate.getTime();
3

Kết quả đầu ra này

const date = new Date("2016-07-27T07:45:00Z");
03. Chỉ là những gì chúng tôi muốn

Bạn cũng có thể sử dụng một số hàm liên quan khác để bản địa hóa cách hiển thị cả ngày và giờ

CodeOutputDescription____44"4. 21. 38 AM"Chỉ hiển thị phiên bản bản địa hóa của thời gian

const currentDate = new Date();
const timestamp = currentDate.getTime();
5"04. 21. 38 AM"Hiển thị thời gian bản địa hóa dựa trên các tùy chọn được cung cấp
const currentDate = new Date();
const timestamp = currentDate.getTime();
6"22/7/2016, 4. 21. 38 AM"Hiển thị ngày và giờ cho ngôn ngữ của người dùng
const currentDate = new Date();
const timestamp = currentDate.getTime();
7"22/7/2016, 04. 21 giờ sáng"Hiển thị ngày và giờ được bản địa hóa dựa trên các tùy chọn được cung cấp

Tính toán ngày và giờ tương đối

Dưới đây là ví dụ về việc thêm 20 ngày vào Ngày JavaScript (tôi. e. , tìm ra ngày 20 ngày sau một ngày đã biết)

const currentDate = new Date();
const timestamp = currentDate.getTime();
8

Đối tượng ngày ban đầu hiện đại diện cho một ngày 20 ngày sau ngày 20 tháng 7 và

const date = new Date("2016-07-27T07:45:00Z");
04 chứa một chuỗi được bản địa hóa đại diện cho ngày đó. Trên trình duyệt của tôi,
const date = new Date("2016-07-27T07:45:00Z");
04 chứa “8/9/2016, 3. 00. 00 giờ tối”

Để tính toán các mốc thời gian tương đối với chênh lệch chính xác hơn so với cả ngày, bạn có thể sử dụng

const date = new Date("2016-07-27T07:45:00Z");
06 và
const date = new Date("2016-07-27T07:45:00Z");
07 để làm việc với các số nguyên biểu thị số mili giây kể từ một kỷ nguyên nhất định—cụ thể là ngày 1 tháng 1 năm 1970. Ví dụ: nếu bạn muốn biết bây giờ là 17 giờ sau khi nào

const currentDate = new Date();
const timestamp = currentDate.getTime();
9

So sánh ngày

Cũng như mọi thứ khác liên quan đến ngày tháng, việc so sánh ngày tháng có những vấn đề riêng

First, we need to create date objects. Fortunately, <, >, <=, and >= all work. So comparing July 19, 2014 and July 18, 2014 is as easy as:

const date1 = new Date("Wed, 27 July 2016 13:30:00");
const date2 = new Date("Wed, 27 July 2016 07:45:00 UTC");
const date3 = new Date("27 July 2016 13:30:00 UTC+05:45");
0

Kiểm tra sự bằng nhau phức tạp hơn, vì hai đối tượng ngày đại diện cho cùng một ngày vẫn là hai đối tượng ngày khác nhau và sẽ không bằng nhau. So sánh các chuỗi ngày là một ý tưởng tồi bởi vì, ví dụ: “20 tháng 7 năm 2014” và “20 tháng 7 năm 2014” biểu thị cùng một ngày nhưng có các biểu diễn chuỗi khác nhau. Đoạn trích dưới đây minh họa điểm đầu tiên

const date1 = new Date("Wed, 27 July 2016 13:30:00");
const date2 = new Date("Wed, 27 July 2016 07:45:00 UTC");
const date3 = new Date("27 July 2016 13:30:00 UTC+05:45");
1

Điều này sẽ xuất ra

const date = new Date("2016-07-27T07:45:00Z");
08

Trường hợp cụ thể này có thể được khắc phục bằng cách so sánh các số nguyên tương đương của các ngày (dấu thời gian của chúng) như sau

const date1 = new Date("Wed, 27 July 2016 13:30:00");
const date2 = new Date("Wed, 27 July 2016 07:45:00 UTC");
const date3 = new Date("27 July 2016 13:30:00 UTC+05:45");
2

Tôi đã thấy ví dụ này ở nhiều nơi, nhưng tôi không thích nó vì bạn không thường tạo một đối tượng ngày tháng từ một đối tượng ngày tháng khác. Vì vậy, tôi cảm thấy rằng ví dụ này chỉ quan trọng từ quan điểm học thuật. Ngoài ra, điều này yêu cầu cả hai đối tượng Ngày phải đề cập đến cùng một giây, trong khi bạn có thể chỉ muốn biết liệu chúng có đề cập đến cùng ngày, giờ hoặc phút hay không

Hãy xem xét một ví dụ thực tế hơn. Bạn đang cố so sánh xem ngày sinh mà người dùng đã nhập có giống với ngày may mắn mà bạn nhận được từ API hay không

const date1 = new Date("Wed, 27 July 2016 13:30:00");
const date2 = new Date("Wed, 27 July 2016 07:45:00 UTC");
const date3 = new Date("27 July 2016 13:30:00 UTC+05:45");
3

Cả hai đại diện cho cùng một ngày nhưng tiếc là người dùng của bạn sẽ không nhận được triệu đô la

Đây là vấn đề. JavaScript luôn coi múi giờ là múi giờ mà trình duyệt cung cấp trừ khi có quy định rõ ràng khác

Điều này có nghĩa là, đối với tôi,

const date = new Date("2016-07-27T07:45:00Z");
09 sẽ tạo ra một ngày 1989-12-20T00. 00. 00+5. 45 hoặc 1989-12-19T18. 15. 00Z không giống với 1989-12-20T00. 00. 00Z về mặt dấu thời gian

Không thể chỉ thay đổi múi giờ của một đối tượng ngày hiện có, vì vậy mục tiêu của chúng tôi bây giờ là tạo một đối tượng ngày mới nhưng với UTC thay vì múi giờ địa phương

Chúng tôi sẽ bỏ qua múi giờ của người dùng và sử dụng UTC trong khi tạo đối tượng ngày. Có hai cách để làm điều đó

  1. Tạo chuỗi ngày có định dạng ISO từ ngày người dùng nhập và sử dụng nó để tạo đối tượng Ngày. Sử dụng định dạng ngày ISO hợp lệ để tạo đối tượng Ngày trong khi làm rõ ý định của UTC so với địa phương
const date1 = new Date("Wed, 27 July 2016 13:30:00");
const date2 = new Date("Wed, 27 July 2016 07:45:00 UTC");
const date3 = new Date("27 July 2016 13:30:00 UTC+05:45");
4

Điều này cũng hoạt động nếu bạn không chỉ định thời gian vì thời gian đó sẽ mặc định là nửa đêm (tôi. e. , 00. 00. 00Z)

const date1 = new Date("Wed, 27 July 2016 13:30:00");
const date2 = new Date("Wed, 27 July 2016 07:45:00 UTC");
const date3 = new Date("27 July 2016 13:30:00 UTC+05:45");
5

Nhớ. Nếu hàm tạo ngày được truyền một chuỗi ở định dạng ngày ISO chính xác là YYYY-MM-DD, nó sẽ tự động giả định UTC

  1. JavaScript cung cấp một Ngày gọn gàng. Hàm UTC() mà bạn có thể sử dụng để lấy dấu thời gian UTC của một ngày. Chúng tôi trích xuất các thành phần từ ngày và chuyển chúng vào hàm
const date1 = new Date("Wed, 27 July 2016 13:30:00");
const date2 = new Date("Wed, 27 July 2016 07:45:00 UTC");
const date3 = new Date("27 July 2016 13:30:00 UTC+05:45");
6

Tìm sự khác biệt giữa hai ngày

Một kịch bản phổ biến bạn sẽ gặp là tìm sự khác biệt giữa hai ngày

Chúng tôi thảo luận về hai trường hợp sử dụng

Tìm số ngày giữa hai ngày

Chuyển đổi cả hai ngày thành dấu thời gian UTC, tìm sự khác biệt tính bằng mili giây và tìm số ngày tương đương

const date1 = new Date("Wed, 27 July 2016 13:30:00");
const date2 = new Date("Wed, 27 July 2016 07:45:00 UTC");
const date3 = new Date("27 July 2016 13:30:00 UTC+05:45");
7

Tìm tuổi của người dùng từ ngày sinh của họ

const date1 = new Date("Wed, 27 July 2016 13:30:00");
const date2 = new Date("Wed, 27 July 2016 07:45:00 UTC");
const date3 = new Date("27 July 2016 13:30:00 UTC+05:45");
8

Ghi chú. Chúng tôi có định dạng không chuẩn. Đọc tài liệu API để xác định xem điều này có nghĩa là ngày 12 tháng 10 hay ngày 10 tháng 12. Thay đổi định dạng ISO cho phù hợp

const date1 = new Date("Wed, 27 July 2016 13:30:00");
const date2 = new Date("Wed, 27 July 2016 07:45:00 UTC");
const date3 = new Date("27 July 2016 13:30:00 UTC+05:45");
9

Tôi biết có nhiều cách ngắn gọn hơn để viết mã này nhưng tôi thích viết theo cách này vì tính logic rõ ràng tuyệt đối

Những gợi ý để tránh địa ngục hẹn hò

Bây giờ chúng ta đã cảm thấy thoải mái với số học ngày tháng, chúng ta có thể hiểu các phương pháp hay nhất để làm theo và lý do để làm theo chúng

Nhận DateTime từ người dùng

Nếu bạn đang lấy ngày và giờ từ người dùng, rất có thể bạn đang tìm kiếm DateTime cục bộ của họ. Chúng ta đã thấy trong phần số học ngày tháng rằng hàm tạo

const date = new Date(2016, 6, 27, 13, 30, 0);
9 có thể chấp nhận ngày tháng theo một số cách khác nhau

Để loại bỏ bất kỳ sự nhầm lẫn nào, tôi luôn khuyên bạn nên tạo ngày bằng định dạng

const date = new Date("2016-07-27T07:45:00Z");
41 ngay cả khi bạn đã có ngày ở định dạng có thể phân tích cú pháp hợp lệ. Nếu tất cả các lập trình viên trong nhóm của bạn tuân theo quy tắc đơn giản này, thì việc duy trì mã trong thời gian dài sẽ cực kỳ dễ dàng vì nó rõ ràng nhất có thể với hàm tạo
const date = new Date(2016, 6, 27, 13, 30, 0);
9

Điều thú vị là bạn có thể sử dụng các biến thể cho phép bạn bỏ qua bất kỳ tham số nào trong bốn tham số cuối cùng nếu chúng bằng không; . e. ,

const date = new Date("2016-07-27T07:45:00Z");
43 giống như
const date = new Date("2016-07-27T07:45:00Z");
44 vì các tham số không xác định được mặc định bằng 0

Ví dụ: nếu bạn đang sử dụng bộ chọn ngày và giờ cung cấp cho bạn ngày 2012-10-12 và thời gian 12. 30, bạn có thể trích xuất các phần và tạo một đối tượng Date mới như sau

const date = new Date(2016, 6, 27, 13, 30, 0);
0

Cố gắng tránh tạo ngày từ chuỗi trừ khi nó ở định dạng ngày ISO. Thay vào đó, hãy sử dụng phương thức Ngày(năm, tháng, ngày, giờ, phút, giây, micro giây)

Chỉ lấy ngày

Nếu bạn chỉ nhận được ngày, chẳng hạn như ngày sinh của người dùng, thì tốt nhất là chuyển đổi định dạng sang định dạng ngày ISO hợp lệ để loại bỏ bất kỳ thông tin múi giờ nào có thể khiến ngày dịch chuyển tiến hoặc lùi khi chuyển đổi sang UTC. Ví dụ

const date = new Date(2016, 6, 27, 13, 30, 0);
1

Trong trường hợp bạn quên, nếu bạn tạo một đối tượng

const date = new Date(2016, 6, 27, 13, 30, 0);
9 với đầu vào ở định dạng ngày ISO hợp lệ (YYYY-MM-DD), nó sẽ mặc định là UTC thay vì mặc định là múi giờ của trình duyệt

Lưu trữ ngày

Luôn lưu trữ DateTime theo UTC. Luôn gửi chuỗi ngày ISO hoặc dấu thời gian đến phần cuối

Nhiều thế hệ lập trình viên máy tính đã nhận ra sự thật đơn giản này sau những trải nghiệm cay đắng khi cố gắng hiển thị giờ địa phương chính xác cho người dùng. Lưu trữ giờ địa phương ở mặt sau là một ý tưởng tồi, tốt hơn là để trình duyệt xử lý việc chuyển đổi sang giờ địa phương ở mặt trước

Ngoài ra, rõ ràng là bạn không bao giờ nên gửi một chuỗi Ngày giờ như “20 tháng 7 năm 1989 12. 10 giờ tối” đến cuối. Ngay cả khi bạn cũng gửi múi giờ, bạn đang tăng cường nỗ lực để các lập trình viên khác hiểu ý định của bạn và phân tích và lưu trữ ngày chính xác

Sử dụng các phương thức

const date = new Date("2016-07-27T07:45:00Z");
46 hoặc
const date = new Date("2016-07-27T07:45:00Z");
47 của đối tượng Date để chuyển đổi DateTime cục bộ thành UTC

const date = new Date(2016, 6, 27, 13, 30, 0);
2

Hiển thị Ngày và Giờ

  1. Nhận dấu thời gian hoặc ngày được định dạng ISO từ API REST
  2. Tạo một đối tượng
    const date = new Date(2016, 6, 27, 13, 30, 0);
    
    9
  3. Sử dụng các phương pháp
    const date = new Date("2016-07-27T07:45:00Z");
    
    49 hoặc
    const date1 = new Date("25 July 2016");
    const date2 = new Date("July 25, 2016");
    
    8 và
    const date = new Date("2016-07-27T07:45:00Z");
    
    61 hoặc thư viện ngày để hiển thị giờ địa phương
const date = new Date(2016, 6, 27, 13, 30, 0);
3

Khi nào bạn cũng nên lưu trữ giờ địa phương?

“Đôi khi đó là nơi xảy ra một sự kiện và việc chuyển đổi sang một múi giờ duy nhất sẽ xóa sạch thông tin đó một cách không thể thay đổi được.

“Nếu bạn đang thực hiện một chương trình khuyến mãi tiếp thị và muốn biết khách hàng nào đã đặt hàng vào khoảng thời gian ăn trưa, thì một đơn hàng có vẻ như được đặt vào buổi trưa theo giờ GMT sẽ không hữu ích lắm khi nó thực sự được đặt trong bữa sáng ở New York. ”

Nếu bạn gặp phải tình huống như vậy, sẽ là khôn ngoan hơn nếu tiết kiệm thời gian địa phương. Như thường lệ, chúng tôi muốn tạo ngày ở định dạng ISO, nhưng trước tiên chúng tôi phải tìm phần bù múi giờ

Hàm

const date = new Date("2016-07-27T07:45:00Z");
62 của đối tượng Date cho chúng ta biết số phút khi được thêm vào một giờ địa phương nhất định sẽ cho thời gian UTC tương đương. Tôi đề nghị chuyển đổi nó thành (+-)hh. mm vì nó làm rõ ràng hơn rằng đó là phần bù múi giờ

const date = new Date(2016, 6, 27, 13, 30, 0);
4

Đối với múi giờ của tôi +05. 45, tôi nhận được -345, đây không chỉ là dấu hiệu ngược lại, mà một số như -345 có thể hoàn toàn khiến nhà phát triển back-end bối rối. Vì vậy, chúng tôi chuyển đổi này thành +05. 45

const date = new Date(2016, 6, 27, 13, 30, 0);
5

Bây giờ chúng tôi nhận phần còn lại của các giá trị và tạo một chuỗi ISO hợp lệ đại diện cho DateTime cục bộ

const date = new Date(2016, 6, 27, 13, 30, 0);
6

Nếu muốn, bạn có thể bọc UTC và ngày địa phương trong một đối tượng

const date = new Date(2016, 6, 27, 13, 30, 0);
7

Bây giờ, ở phần cuối, nếu bạn muốn tìm hiểu xem sự kiện có xảy ra trước buổi trưa theo giờ địa phương hay không, bạn có thể phân tích cú pháp ngày và chỉ cần sử dụng hàm

const date = new Date("2016-07-27T07:45:00Z");
63

const date = new Date(2016, 6, 27, 13, 30, 0);
8

Chúng tôi không sử dụng

const date = new Date("2016-07-27T07:45:00Z");
64 ở đây, nhưng chúng tôi vẫn lưu trữ nó vì chúng tôi có thể cần nó trong tương lai cho mục đích gỡ lỗi. Bạn thực sự chỉ có thể gửi chênh lệch múi giờ và chỉ thời gian UTC. Nhưng tôi cũng thích lưu trữ giờ địa phương vì cuối cùng bạn sẽ phải lưu trữ ngày trong cơ sở dữ liệu và việc lưu trữ riêng giờ địa phương cho phép bạn truy vấn trực tiếp dựa trên một trường thay vì phải thực hiện các phép tính để lấy ngày địa phương

Đôi khi, ngay cả khi đã lưu múi giờ địa phương, bạn vẫn muốn hiển thị ngày ở một múi giờ cụ thể. Ví dụ: thời gian cho các sự kiện có thể hợp lý hơn theo múi giờ của người dùng hiện tại nếu chúng là ảo hoặc theo múi giờ nơi chúng sẽ diễn ra trên thực tế nếu chúng không. Trong mọi trường hợp, bạn nên xem trước các giải pháp đã được thiết lập để định dạng với tên múi giờ rõ ràng

Cấu hình máy chủ và cơ sở dữ liệu

Luôn định cấu hình máy chủ và cơ sở dữ liệu của bạn để sử dụng múi giờ UTC. (Lưu ý rằng UTC và GMT không giống nhau—ví dụ: GMT có thể ngụ ý chuyển sang BST trong suốt mùa hè, trong khi UTC sẽ không bao giờ. )

Chúng tôi đã thấy mức độ khó khăn của chuyển đổi múi giờ, đặc biệt là khi chúng ngoài ý muốn. Luôn gửi Ngày giờ UTC và định cấu hình máy chủ của bạn ở múi giờ UTC có thể giúp cuộc sống của bạn dễ dàng hơn. Mã back-end của bạn sẽ đơn giản và gọn gàng hơn nhiều vì nó không phải thực hiện bất kỳ chuyển đổi múi giờ nào. Dữ liệu DateTime đến từ các máy chủ trên toàn thế giới có thể được so sánh và sắp xếp dễ dàng

Mã ở phía sau có thể giả sử múi giờ của máy chủ là UTC (nhưng vẫn phải kiểm tra tại chỗ để chắc chắn). Kiểm tra cấu hình đơn giản giúp tiết kiệm việc phải suy nghĩ và viết mã cho các chuyển đổi mỗi khi viết mã DateTime mới

Đã đến lúc xử lý ngày tháng tốt hơn

Thao tác ngày là một vấn đề khó khăn. Các khái niệm đằng sau các ví dụ thực tế trong bài viết này áp dụng ngoài JavaScript và chỉ là khởi đầu khi xử lý đúng dữ liệu DateTime và tính toán. Ngoài ra, mọi thư viện trợ giúp sẽ có nhiều sắc thái—điều này thậm chí đúng với hỗ trợ tiêu chuẩn chính thức cuối cùng{target=”_blank”} cho các loại hoạt động này

Điểm mấu chốt là. Sử dụng ISO ở mặt sau và để giao diện người dùng định dạng đúng mọi thứ cho người dùng. Các lập trình viên chuyên nghiệp sẽ nhận thức được một số sắc thái và sẽ (dứt khoát hơn) sử dụng các thư viện DateTime được hỗ trợ tốt ở cả mặt sau và mặt trước. Các chức năng tích hợp ở phía cơ sở dữ liệu lại là một câu chuyện khác, nhưng hy vọng bài viết này cũng cung cấp đủ thông tin cơ bản để đưa ra các quyết định sáng suốt hơn trong bối cảnh đó

Có liên quan. Mã JavaScript lỗi. 10 lỗi phổ biến nhất mà các nhà phát triển JavaScript mắc phải

thẻ

Ngày giờ thao tác JavaScript

Người làm việc tự do? Tìm công việc tiếp theo của bạn.

Việc làm Software Developer

Xem thông tin đầy đủ

Trừng phạt Jajodia

Kỹ sư phần mềm tự do

Giới thiệu về tác giả

Punit là một doanh nhân và nhà phát triển phần mềm mà tính linh hoạt là thế mạnh lớn nhất của anh ấy. Anh đã làm việc cho nhiều dự án khác nhau, từ mô phỏng 3D thời gian thực trên trình duyệt và phân tích dữ liệu lớn cho đến ứng dụng Windows. Gần đây, anh ấy cũng đã mạo hiểm tham gia đào tạo về MEAN stack

Thuê trừng phạt

Bình luận

Ruslan

Đó là bài viết hay về Date. Tất cả những người gặp phải vấn đề với việc chuyển đổi ngày tháng đều hiểu sự phức tạp và tinh tế. Nhưng trong các dự án thực tế, cần rất nhiều mã. Tất nhiên bạn có thể viết ngày mở rộng lớp của riêng bạn. Nhưng có những thư viện sẵn sàng được hoàn thiện và thử nghiệm qua nhiều năm trên nhiều dự án. Tôi chưa gặp các dự án, sẽ không sử dụng khoảnh khắc. js. Tôi nghĩ đó cũng là một mặt mạnh của JS - sự giàu có của các thư viện tốt. Những khó khăn mà tác giả gặp phải khi làm việc với các thư viện DateTime là gì?

Ruslan

Đó là bài viết hay về Date. Tất cả những người gặp phải vấn đề với việc chuyển đổi ngày tháng đều hiểu sự phức tạp và tinh tế. Nhưng trong các dự án thực tế, cần rất nhiều mã. Tất nhiên bạn có thể viết ngày mở rộng lớp của riêng bạn. Nhưng có những thư viện sẵn sàng được hoàn thiện và thử nghiệm qua nhiều năm trên nhiều dự án. Tôi chưa gặp các dự án, sẽ không sử dụng khoảnh khắc. js. Tôi nghĩ đó cũng là một mặt mạnh của JS - sự giàu có của các thư viện tốt. Những khó khăn mà tác giả gặp phải khi làm việc với các thư viện DateTime là gì?

Trừng phạt Jajodia

Tôi không đề xuất người đọc mở rộng đối tượng Ngày JavaScript hoặc tạo thư viện của riêng họ. tôi sử dụng khoảnh khắc. js bản thân mình. Nhưng như tôi đã đề cập trong bài viết, chúng ta thường sử dụng các thư viện ngày tháng mà không nghĩ xem ngày/giờ thực sự hoạt động như thế nào. Thông thường, các lỗi mà chúng tôi gặp phải không phải do bất kỳ điểm yếu cố hữu nào trong chính thư viện, mà do chúng tôi thiếu hiểu biết về những điều cơ bản. Vì vậy, tôi không gặp bất kỳ khó khăn nào với các thư viện DateTime, nhưng khi tạo ứng dụng tổng thể, có rất nhiều giao diện giữa "đối tượng" Ngày và "chuỗi" Ngày khiến tôi thường bị nhầm lẫn * lấy ngày từ người dùng * gửi . Một vấn đề cụ thể mà tôi gặp phải là khi tôi phải tạo một ứng dụng theo dõi lượng calo tiêu thụ của người dùng. Nếu người dùng đang đi du lịch, thì việc quản lý "thời gian" người dùng dùng bữa hóa ra lại là một vấn đề phức tạp. Khi tôi vật lộn với những đoạn mã chắp vá trên internet, tôi nhận ra rằng cần có một bài báo cho thấy bức tranh toàn cảnh hơn

Trừng phạt Jajodia

Tôi không đề xuất người đọc mở rộng đối tượng Ngày JavaScript hoặc tạo thư viện của riêng họ. tôi sử dụng khoảnh khắc. js bản thân mình. Nhưng như tôi đã đề cập trong bài viết, chúng ta thường sử dụng các thư viện ngày tháng mà không nghĩ xem ngày/giờ thực sự hoạt động như thế nào. Thông thường, các lỗi mà chúng tôi gặp phải không phải do bất kỳ điểm yếu cố hữu nào trong chính thư viện, mà do chúng tôi thiếu hiểu biết về những điều cơ bản. Vì vậy, tôi không gặp bất kỳ khó khăn nào với các thư viện DateTime, nhưng khi tạo ứng dụng tổng thể, có rất nhiều giao diện giữa "đối tượng" Ngày và "chuỗi" Ngày khiến tôi thường bị nhầm lẫn * lấy ngày từ người dùng * gửi . Một vấn đề cụ thể mà tôi gặp phải là khi tôi phải tạo một ứng dụng theo dõi lượng calo tiêu thụ của người dùng. Nếu người dùng đang đi du lịch, thì việc quản lý "thời gian" người dùng dùng bữa hóa ra lại là một vấn đề phức tạp. Khi tôi vật lộn với những đoạn mã chắp vá trên internet, tôi nhận ra rằng cần có một bài báo cho thấy bức tranh toàn cảnh hơn

Ashish Agrawal

trừng phạt. bạn hoàn toàn đúng, mọi lập trình viên đều đã hoặc đang đối mặt với vấn đề ngày tháng này trong sự nghiệp lập trình của mình. Bài viết của bạn thực sự rất hay, đủ cho lập trình viên không biết gì về chuyển đổi ngày tháng và thao tác. Công việc tuyệt vời trên bài viết này

Ashish Agrawal

trừng phạt. bạn hoàn toàn đúng, mọi lập trình viên đều đã hoặc đang đối mặt với vấn đề ngày tháng này trong sự nghiệp lập trình của mình. Bài viết của bạn thực sự rất hay, đủ cho lập trình viên không biết gì về chuyển đổi ngày tháng và thao tác. Công việc tuyệt vời trên bài viết này

ananthhh

Bài báo tuyệt vời. Thanh danh. 1 chỉnh sửa nhỏ "Chuyển đổi cả hai ngày thành dấu thời gian UTC, tìm sự khác biệt tính bằng micro giây và tìm ngày tương đương. " Trên thực tế, bạn đang tìm kiếm sự khác biệt tính bằng mili giây. Tôi cảm thấy rằng, linh hồn thực sự của bài viết (Phần phụ trợ nên có ngày giờ được định dạng ISO và giao diện người dùng nên quan tâm đến việc chuyển đổi định dạng ISO sang ngày giờ cục bộ thân thiện với người dùng) đã bị lạc vào quá nhiều đoạn mã. CHỈNH SỬA. "Luôn định cấu hình máy chủ và cơ sở dữ liệu của bạn để sử dụng múi giờ GMT/UTC. "Tôi nghĩ điều này là không cần thiết. Bởi vì máy chủ sẽ luôn nhận ngày được định dạng ISO

ananthhh

Bài báo tuyệt vời. Thanh danh. 1 chỉnh sửa nhỏ "Chuyển đổi cả hai ngày thành dấu thời gian UTC, tìm sự khác biệt tính bằng micro giây và tìm ngày tương đương. " Trên thực tế, bạn đang tìm kiếm sự khác biệt tính bằng mili giây. Tôi cảm thấy rằng, linh hồn thực sự của bài viết (Phần phụ trợ nên có ngày giờ được định dạng ISO và giao diện người dùng nên quan tâm đến việc chuyển đổi định dạng ISO sang ngày giờ cục bộ thân thiện với người dùng) đã bị lạc vào quá nhiều đoạn mã. CHỈNH SỬA. "Luôn định cấu hình máy chủ và cơ sở dữ liệu của bạn để sử dụng múi giờ GMT/UTC. "Tôi nghĩ điều này là không cần thiết. Bởi vì máy chủ sẽ luôn nhận ngày được định dạng ISO

Trừng phạt Jajodia

Cảm ơn vì những lời động viên Ashish. )

Trừng phạt Jajodia

Cảm ơn vì những lời động viên Ashish. )

Anit Shrestha Manandhar

đọc hay. Cảm ơn Punit

Anit Shrestha Manandhar

đọc hay. Cảm ơn Punit

Vadim

Cảm ơn vì bài viết hay, Punit. Làm việc với datetime luôn gây ra vấn đề (đối với tôi. Tôi nghĩ, tôi không ngoại lệ). Bài viết của bạn làm cho quá trình này không quá đau đớn. )

Vadim

Cảm ơn vì bài viết hay, Punit. Làm việc với datetime luôn gây ra vấn đề (đối với tôi. Tôi nghĩ, tôi không ngoại lệ). Bài viết của bạn làm cho quá trình này không quá đau đớn. )

Andy Hubert

Lỗi đánh máy nhỏ nhưng quan trọng. Bạn đã viết ". nếu bạn tạo một đối tượng Ngày với định dạng ngày ISO [NO SPACE] không hợp lệ. "nhưng có nghĩa là". nếu bạn tạo một đối tượng Ngày với đầu vào ở định dạng ngày ISO [VỚI KHÔNG GIAN] hợp lệ. "

Andy Hubert

Lỗi đánh máy nhỏ nhưng quan trọng. Bạn đã viết ". nếu bạn tạo một đối tượng Ngày với định dạng ngày ISO [NO SPACE] không hợp lệ. "nhưng có nghĩa là". nếu bạn tạo một đối tượng Ngày với đầu vào ở định dạng ngày ISO [VỚI KHÔNG GIAN] hợp lệ. "

millermedeiros

có một vài vấn đề với các ví dụ ở đây. TL;DR; . Tôi sẽ không đi qua tất cả mọi thứ nhưng một vài lưu ý. làm bất kỳ loại số học là dễ bị lỗi. Cách bạn tính `daysDiff` sẽ sai nếu có chuyển đổi DST giữa các ngày. Cách chính xác để thực hiện nó là sử dụng tổng số ngày trong tháng cho mỗi tháng ở giữa hoặc chỉ cần loại bỏ thông tin thời gian và sử dụng ngày UTC để tính toán sự khác biệt. mọi người hiểu sai (xem bình luận của tôi ở đây. https. //github. com/moment/moment/pull/571#issuecomment-16301301) Cũng có một lỗi trên Firefox đối với những thứ như `date. setDate(ngày. getDate() + 3)` liên quan đến DST. https. // bugzilla. mozilla. tổ chức/show_bug. cgi?id=1084434 (Safari và Chrome gặp vấn đề tương tự nhưng đã được khắc phục cách đây vài năm) `getTimeZoneOffset` là một loại vũ khí dùng chân; . - cách thích hợp là thực sự có múi giờ làm cài đặt người dùng và hoàn toàn không sử dụng độ lệch để tính toán (sử dụng một số thư viện/ngôn ngữ phụ trợ có bảng chuyển đổi múi giờ/DST cập nhật). - múi giờ ở giao diện người dùng khó (xem. http. // stackoverflow. com/a/37798868 và https. // vi. wikipedia. org/wiki/Tz_database) Vì vậy, nếu bạn muốn tránh các sự cố, tốt hơn hết bạn chỉ nên sử dụng các phương thức ngày UTC trong JavaScript; . 4, tháng. 10 năm. 2016}` và không sử dụng `new Date()`

millermedeiros

có một vài vấn đề với các ví dụ ở đây. TL;DR; . Tôi sẽ không đi qua tất cả mọi thứ nhưng một vài lưu ý. làm bất kỳ loại số học là dễ bị lỗi. Cách bạn tính `daysDiff` sẽ sai nếu có chuyển đổi DST giữa các ngày. Cách chính xác để thực hiện nó là sử dụng tổng số ngày trong tháng cho mỗi tháng ở giữa hoặc chỉ cần loại bỏ thông tin thời gian và sử dụng ngày UTC để tính toán sự khác biệt. mọi người hiểu sai (xem bình luận của tôi ở đây. https. //github. com/moment/moment/pull/571#issuecomment-16301301) Cũng có một lỗi trên Firefox đối với những thứ như `date. setDate(ngày. getDate() + 3)` liên quan đến DST. https. // bugzilla. mozilla. tổ chức/show_bug. cgi?id=1084434 (Safari và Chrome gặp vấn đề tương tự nhưng đã được khắc phục cách đây vài năm) `getTimeZoneOffset` là một loại vũ khí dùng chân; . - cách thích hợp là thực sự có múi giờ làm cài đặt người dùng và hoàn toàn không sử dụng độ lệch để tính toán (sử dụng một số thư viện/ngôn ngữ phụ trợ có bảng chuyển đổi múi giờ/DST cập nhật). - múi giờ ở giao diện người dùng khó (xem. http. // stackoverflow. com/a/37798868 và https. // vi. wikipedia. org/wiki/Tz_database) Vì vậy, nếu bạn muốn tránh các sự cố, tốt hơn hết bạn chỉ nên sử dụng các phương thức ngày UTC trong JavaScript; . 4, tháng. 10 năm. 2016}` và không sử dụng `new Date()`

Khaled Monsoor

đọc tốt. Nhưng, có một số vấn đề. ví dụ: đầu ra của dòng mã đầu tiên của bạn `var date = new Date("32 Tháng bảy 2016 15. 00. 00 GMT");` là sai, ít nhất là trên Chrome & Firefox mới nhất. Mặc dù nó chắc chắn không ném ngoại lệ, nhưng nó đặt `date` thành `Invalid Date`

Khaled Monsoor

đọc tốt. Nhưng, có một số vấn đề. ví dụ: đầu ra của dòng mã đầu tiên của bạn `var date = new Date("32 Tháng bảy 2016 15. 00. 00 GMT");` là sai, ít nhất là trên Chrome & Firefox mới nhất. Mặc dù nó chắc chắn không ném ngoại lệ, nhưng nó đặt `date` thành `Invalid Date`

juanvillegas

Tôi nghĩ ý của anh ấy khi định cấu hình máy chủ trong UTC là nếu không, nếu bạn định tạo một ngày mới, bạn sẽ phải thông báo rõ ràng cho ngôn ngữ phụ trợ của mình (tức là. php) rằng đó là UTC. Tương tự đối với cơ sở dữ liệu, tất cả các mốc thời gian được tạo tự động sẽ ở một thứ không phải là UTC, đây là một vấn đề

juanvillegas

Tôi nghĩ ý của anh ấy khi định cấu hình máy chủ trong UTC là nếu không, nếu bạn định tạo một ngày mới, bạn sẽ phải thông báo rõ ràng cho ngôn ngữ phụ trợ của mình (tức là. php) rằng đó là UTC. Tương tự đối với cơ sở dữ liệu, tất cả các mốc thời gian được tạo tự động sẽ ở một thứ không phải là UTC, đây là một vấn đề

Trừng phạt Jajodia

Cảm ơn bạn đã chia sẻ liên kết đến vấn đề tính toán chênh lệch ngày. Nó sẽ là một tài liệu tham khảo thêm cho độc giả. Số học ngày rất phức tạp, thậm chí còn phức tạp hơn khi có sự chuyển đổi DST. Khi viết bài, tôi đã phải cố tình loại bỏ DST để bài viết không quá dài. Rõ ràng là bạn sẽ cần sự trợ giúp của thư viện để đảm bảo rằng các phép tính DateTime của bạn hoạt động với độ chính xác hợp lý. Các phương pháp và đoạn mã tôi đã trình bày được cho là mang tính giáo dục hơn so với mã tiêu chuẩn ngành. Nếu bạn để ý, tôi chưa thực sự sử dụng giá trị tôi nhận được từ getTimeZoneOffset() trong ví dụ cần giờ địa phương và chỉ giữ nó dưới dạng siêu dữ liệu được sử dụng để gỡ lỗi. Một lần nữa, một bài viết có cùng độ dài với bài báo này có thể chỉ viết về điều này. Nếu bạn đang lưu trữ múi giờ dưới dạng cài đặt người dùng, thì các phương thức ngày UTC trong JavaScript sẽ đủ và có thể tránh hoàn toàn new Date()

Trừng phạt Jajodia

Cảm ơn bạn đã chia sẻ liên kết đến vấn đề tính toán chênh lệch ngày. Nó sẽ là một tài liệu tham khảo thêm cho độc giả. Số học ngày rất phức tạp, thậm chí còn phức tạp hơn khi có sự chuyển đổi DST. Khi viết bài, tôi đã phải cố tình loại bỏ DST để bài viết không quá dài. Rõ ràng là bạn sẽ cần sự trợ giúp của thư viện để đảm bảo rằng các phép tính DateTime của bạn hoạt động với độ chính xác hợp lý. Các phương pháp và đoạn mã tôi đã trình bày được cho là mang tính giáo dục hơn so với mã tiêu chuẩn ngành. Nếu bạn để ý, tôi chưa thực sự sử dụng giá trị tôi nhận được từ getTimeZoneOffset() trong ví dụ cần giờ địa phương và chỉ giữ nó dưới dạng siêu dữ liệu được sử dụng để gỡ lỗi. Một lần nữa, một bài viết có cùng độ dài với bài báo này có thể chỉ viết về điều này. Nếu bạn đang lưu trữ múi giờ dưới dạng cài đặt người dùng, thì các phương thức ngày UTC trong JavaScript sẽ đủ và có thể tránh hoàn toàn new Date()

Trừng phạt Jajodia

Cảm ơn đã chỉ ra điều đó. tôi đã sửa nó. . )

Trừng phạt Jajodia

Cảm ơn đã chỉ ra điều đó. tôi đã sửa nó. . )

Trừng phạt Jajodia

Tôi rất vui vì bài viết hữu ích. Đừng quên sử dụng nó như một nội dung giáo dục và sử dụng thư viện như khoảnh khắc. js bất cứ khi nào có thể

Trừng phạt Jajodia

Tôi rất vui vì bài viết hữu ích. Đừng quên sử dụng nó như một nội dung giáo dục và sử dụng thư viện như khoảnh khắc. js bất cứ khi nào có thể

tapfumamanhanga

Bài viết hay thật. Tôi gặp phải rất nhiều thách thức khi cố gắng xử lý ngày tháng trong một dự án điểm bán hàng trực tuyến. Nó liên quan đến rất nhiều hàm ngày tháng và số học ngày tháng mà bằng cách nào đó tôi đã vượt qua được một cách thần kỳ. Sau khi đọc bài viết này, có một số khái niệm cơ bản tôi đã chọn sẽ giúp tôi trong các dự án trong tương lai

tapfumamanhanga

Bài viết hay thật. Tôi gặp phải rất nhiều thách thức khi cố gắng xử lý ngày tháng trong một dự án điểm bán hàng trực tuyến. Nó liên quan đến rất nhiều hàm ngày tháng và số học ngày tháng mà bằng cách nào đó tôi đã vượt qua được một cách thần kỳ. Sau khi đọc bài viết này, có một số khái niệm cơ bản tôi đã chọn sẽ giúp tôi trong các dự án trong tương lai

Michael Haephrati

Tôi đã viết một bài báo về http đó. //www. dự án mật mã. com/Articles/792931/Date-time-batch-changer-for-photos-and-other-files

Michael Haephrati

Tôi đã viết một bài báo về http đó. //www. dự án mật mã. com/Articles/792931/Date-time-batch-changer-for-photos-and-other-files

David Bruchmann

Có nhiều hạn chế về ngày liên quan đến các công cụ và định dạng bạn đang sử dụng. Hạn chế nổi tiếng nhất là dấu thời gian, bắt đầu từ 1. 1. 1970. Trong nhiều ứng dụng, bản ghi có ngày này nếu người dùng không bao giờ nhập ngày. Thời gian càng trôi qua, tình huống càng trở nên không rõ ràng và càng có nhiều khả năng giá trị bằng 0 dẫn đến nhầm lẫn và bị hiểu sai. Nếu ai đó được sinh ra vào ngày đó lúc 0. 00 thì có thể ngày-giờ-sinh của anh ấy sẽ được hiểu là trống/không được nhập. Vẫn còn nhiều hạn chế, tùy theo năm tháng. 1900, 1000, 0, v.v. Nếu bạn phải xử lý các ngày lịch sử thì đây là một vấn đề lớn, vì bạn phải lập trình ngay cả Đối tượng ngày mới cho một số ngôn ngữ lập trình và cơ sở dữ liệu. Vì vậy, nếu bạn sử dụng các thư viện cho những vấn đề đó, hãy xem liệu các đối tượng ngày tháng đã sử dụng có hỗ trợ dateTimes đã sử dụng hay không, nếu không, bạn có thể trực tiếp tìm kiếm một thư viện khác. Liên quan đến những hạn chế, toàn bộ vấn đề về ngày giờ là lỗi lớn nhất trong toàn bộ bối cảnh CNTT, bất kể ngôn ngữ lập trình hay loại cơ sở dữ liệu

David Bruchmann

Có nhiều hạn chế về ngày liên quan đến các công cụ và định dạng bạn đang sử dụng. Hạn chế nổi tiếng nhất là dấu thời gian, bắt đầu từ 1. 1. 1970. Trong nhiều ứng dụng, bản ghi có ngày này nếu người dùng không bao giờ nhập ngày. Thời gian càng trôi qua, tình huống càng trở nên không rõ ràng và càng có nhiều khả năng giá trị bằng 0 dẫn đến nhầm lẫn và bị hiểu sai. Nếu ai đó được sinh ra vào ngày đó lúc 0. 00 thì có thể ngày-giờ-sinh của anh ấy sẽ được hiểu là trống/không được nhập. Vẫn còn nhiều hạn chế, tùy theo năm tháng. 1900, 1000, 0, v.v. Nếu bạn phải xử lý các ngày lịch sử thì đây là một vấn đề lớn, vì bạn phải lập trình ngay cả Đối tượng ngày mới cho một số ngôn ngữ lập trình và cơ sở dữ liệu. Vì vậy, nếu bạn sử dụng các thư viện cho những vấn đề đó, hãy xem liệu các đối tượng ngày tháng đã sử dụng có hỗ trợ dateTimes đã sử dụng hay không, nếu không, bạn có thể trực tiếp tìm kiếm một thư viện khác. Liên quan đến những hạn chế, toàn bộ vấn đề về ngày giờ là lỗi lớn nhất trong toàn bộ bối cảnh CNTT, bất kể ngôn ngữ lập trình hay loại cơ sở dữ liệu

Frédéric Camblor

bài viết hay. Có (ít nhất) một trường hợp sử dụng quan trọng mà bạn chưa đề cập trong bài viết này. khi bạn phải đối phó với "chỉ thời gian" (chứ không phải thời gian gắn liền với một ngày). Trường hợp sử dụng điển hình. giả sử bạn muốn thực hiện một chương trình làm việc và muốn mô hình hóa câu "Tôi có một cuộc họp vào thứ Hai hàng tuần lúc 10. 00 giờ sáng". Bạn sẽ lưu trữ cái này trong DB như thế nào? . 00 AM", có nghĩa là "lúc 10. 00 AM múi giờ của tôi tính đến hôm nay". Một câu hỏi quan trọng để xem xét sẽ là. "nếu chênh lệch múi giờ thay đổi trong năm, tôi có nên giữ nguyên 10. 00 giờ sáng cho dù múi giờ của tôi có chênh lệch múi giờ hay không, hoặc nó có nên được thay đổi cùng với thay đổi chênh lệch múi giờ của tôi không. " Một ví dụ có thể rõ ràng hơn. tôi sống ở Pháp. Chênh lệch múi giờ hiện tại của chúng tôi kể từ hôm nay (ngày 30 tháng 1 năm 2017) it +01. 00 kể từ khi chúng ta vào mùa đông. Thay đổi giờ mùa hè được lên kế hoạch kích hoạt vào ngày 26 tháng 3 năm 2017 lúc 01. 00 UTC, nghĩa là lúc đó chúng ta sẽ chuyển từ 02. 00+01. 00 đến 03. 00+02. 00. Khi nào tôi sẽ tạo mục chương trình nghị sự của mình "lúc 10. 00 AM", nó sẽ tạo một cuộc họp lúc 10. 00+01. 00 cho mỗi tuần sắp tới. Tuy nhiên, một khi tôi chuyển sang thời gian mùa hè, điều gì sẽ xảy ra? . - Đặt một mục chương trình nghị sự ở 10. 00+02. 00. ở đó, các đồng đội của tôi ở Pháp sẽ tiếp tục tham dự cuộc họp vào cùng một giờ trong ngày, bất kể chúng tôi đang ở mùa hè hay mùa đông. Tuy nhiên, nếu tôi làm việc với các đồng đội ở các quốc gia khác ngoài Pháp, với thời gian chuyển đổi mùa đông/hè khác (hoặc đơn giản là không), thì giờ trong ngày của họ sẽ bị thay đổi. - Đặt một mục chương trình nghị sự ở 11. 00+02. 00 (=giữ nguyên 09 ban đầu. 00Z bù múi giờ). Ở đây, các đồng đội của tôi ở Pháp sẽ ngạc nhiên vào ngày 27 tháng 3 vì nó sẽ phá vỡ thói quen của họ. Tuy nhiên, đồng đội của tôi ở Mỹ sẽ không bị ảnh hưởng bởi sự thay đổi này vào ngày 27 tháng 3. Đối với trường hợp sử dụng điển hình này, nơi chúng tôi chỉ làm việc với thời gian (và ngày xảy ra cùng với thứ nguyên thời gian), tôi sẽ cung cấp cách triển khai lưu trữ khác nhau tùy thuộc vào 2 tùy chọn ở trên. - Đối với tùy chọn đầu tiên, nơi chúng tôi đang làm việc với "thời gian được đặt múi giờ", tôi sẽ lưu trữ thời gian ("10. 00. 00") không đính kèm phần bù múi giờ + Múi giờ ("Châu Âu/Paris"). theo cách đó, được cung cấp một ngày (giả sử là 27-03-2017) tôi sẽ có thể tính toán ngày đó cho múi giờ "Châu Âu/Paris", "10. 00" sẽ là "10. 00+02. 00" vào ngày 27-03-2017. - Đối với tùy chọn thứ hai, tôi sẽ xem xét lưu trữ thời gian dưới dạng "Giờ UTC", ví dụ: lưu trữ "09. 00Z" (đặt múi giờ UTC cùng với thời gian, để ghi nhớ rằng tôi đang làm việc theo giờ UTC). Bằng cách đó, vào ngày 27-03-2017, tôi sẽ thêm thời gian UTC này vào ngày, sau đó chuyển đổi nó thành múi giờ mục tiêu (trong trường hợp của tôi, tôi sẽ kết thúc bằng "11. 00+02. 00") Trân trọng,

Frédéric Camblor

bài viết hay. Có (ít nhất) một trường hợp sử dụng quan trọng mà bạn chưa đề cập trong bài viết này. khi bạn phải đối phó với "chỉ thời gian" (chứ không phải thời gian gắn liền với một ngày). Trường hợp sử dụng điển hình. giả sử bạn muốn thực hiện một chương trình làm việc và muốn mô hình hóa câu "Tôi có một cuộc họp vào thứ Hai hàng tuần lúc 10. 00 giờ sáng". Bạn sẽ lưu trữ cái này trong DB như thế nào? . 00 AM", có nghĩa là "lúc 10. 00 AM múi giờ của tôi tính đến hôm nay". Một câu hỏi quan trọng để xem xét sẽ là. "nếu chênh lệch múi giờ thay đổi trong năm, tôi có nên giữ nguyên 10. 00 giờ sáng cho dù múi giờ của tôi có chênh lệch múi giờ hay không, hoặc nó có nên được thay đổi cùng với thay đổi chênh lệch múi giờ của tôi không. " Một ví dụ có thể rõ ràng hơn. tôi sống ở Pháp. Chênh lệch múi giờ hiện tại của chúng tôi kể từ hôm nay (ngày 30 tháng 1 năm 2017) it +01. 00 kể từ khi chúng ta vào mùa đông. Thay đổi giờ mùa hè được lên kế hoạch kích hoạt vào ngày 26 tháng 3 năm 2017 lúc 01. 00 UTC, nghĩa là lúc đó chúng ta sẽ chuyển từ 02. 00+01. 00 đến 03. 00+02. 00. Khi nào tôi sẽ tạo mục chương trình nghị sự của mình "lúc 10. 00 AM", nó sẽ tạo một cuộc họp lúc 10. 00+01. 00 cho mỗi tuần sắp tới. Tuy nhiên, một khi tôi chuyển sang thời gian mùa hè, điều gì sẽ xảy ra? . - Đặt một mục chương trình nghị sự ở 10. 00+02. 00. ở đó, các đồng đội của tôi ở Pháp sẽ tiếp tục tham dự cuộc họp vào cùng một giờ trong ngày, bất kể chúng tôi đang ở mùa hè hay mùa đông. Tuy nhiên, nếu tôi làm việc với các đồng đội ở các quốc gia khác ngoài Pháp, với thời gian chuyển đổi mùa đông/hè khác (hoặc đơn giản là không), thì giờ trong ngày của họ sẽ bị thay đổi. - Đặt một mục chương trình nghị sự ở 11. 00+02. 00 (=giữ nguyên 09 ban đầu. 00Z bù múi giờ). Ở đây, các đồng đội của tôi ở Pháp sẽ ngạc nhiên vào ngày 27 tháng 3 vì nó sẽ phá vỡ thói quen của họ. Tuy nhiên, đồng đội của tôi ở Mỹ sẽ không bị ảnh hưởng bởi sự thay đổi này vào ngày 27 tháng 3. Đối với trường hợp sử dụng điển hình này, nơi chúng tôi chỉ làm việc với thời gian (và ngày xảy ra cùng với thứ nguyên thời gian), tôi sẽ cung cấp cách triển khai lưu trữ khác nhau tùy thuộc vào 2 tùy chọn ở trên. - Đối với tùy chọn đầu tiên, nơi chúng tôi đang làm việc với "thời gian được đặt múi giờ", tôi sẽ lưu trữ thời gian ("10. 00. 00") không đính kèm phần bù múi giờ + Múi giờ ("Châu Âu/Paris"). theo cách đó, được cung cấp một ngày (giả sử là 27-03-2017) tôi sẽ có thể tính toán ngày đó cho múi giờ "Châu Âu/Paris", "10. 00" sẽ là "10. 00+02. 00" vào ngày 27-03-2017. - Đối với tùy chọn thứ hai, tôi sẽ xem xét lưu trữ thời gian dưới dạng "Giờ UTC", ví dụ: lưu trữ "09. 00Z" (đặt múi giờ UTC cùng với thời gian, để ghi nhớ rằng tôi đang làm việc theo giờ UTC). Bằng cách đó, vào ngày 27-03-2017, tôi sẽ thêm thời gian UTC này vào ngày, sau đó chuyển đổi nó thành múi giờ mục tiêu (trong trường hợp của tôi, tôi sẽ kết thúc bằng "11. 00+02. 00") Trân trọng,

Mohd Akram

Đây là một bài viết rất nhiều thông tin. Tôi cũng đồng ý với tiêu đề bài đăng của bạn và bạn giải thích rất rõ quan điểm của mình. Tôi rất vui khi thấy bài viết này. cảm ơn đã chia sẻ với chúng tôi. Giữ nó lên và chia sẻ bài viết liên quan nhất. www. từ mã. com

Mohd Akram

Đây là một bài viết rất nhiều thông tin. Tôi cũng đồng ý với tiêu đề bài đăng của bạn và bạn giải thích rất rõ quan điểm của mình. Tôi rất vui khi thấy bài viết này. cảm ơn đã chia sẻ với chúng tôi. Giữ nó lên và chia sẻ bài viết liên quan nhất. www. từ mã. com

Nicola

https. //www. đỉnh cao. com/software/definitive-guide-to-datetime-manipulation#storing-the-date var timeParts = timefromUI. tách ra(". "); phải là var timeParts = timeFromUI. tách ra(". "); Bài báo tuyệt vời. Nó thuyết phục tôi không sử dụng trực tiếp Ngày JS và thay vào đó sử dụng thời điểm

Nicola

https. //www. đỉnh cao. com/software/definitive-guide-to-datetime-manipulation#storing-the-date var timeParts = timefromUI. tách ra(". "); phải là var timeParts = timeFromUI. tách ra(". "); Bài báo tuyệt vời. Nó thuyết phục tôi không sử dụng trực tiếp Ngày JS và thay vào đó sử dụng thời điểm

urvashi majithia

Xin chào, Có thể lấy cùng một ngày từ một trường ngày khác, giống như kế thừa cùng một ngày không?

urvashi majithia

Xin chào, Có thể lấy cùng một ngày từ một trường ngày khác, giống như kế thừa cùng một ngày không?

Pawan sâu

Xin chào Punit, Điều đó có thể không, tôi có một ngày như ngày mới ('19 tháng 8 năm 1975 23. 15. 30 GMT+07. 00') và tôi muốn lấy tên khu vực có tên quốc gia như "America/New_York"?

Pawan sâu

Xin chào Punit, Điều đó có thể không, tôi có một ngày như ngày mới ('19 tháng 8 năm 1975 23. 15. 30 GMT+07. 00') và tôi muốn lấy tên khu vực có tên quốc gia như "America/New_York"?

Công chúa

Xin chào, bạn có thể giúp tôi với logic. Tôi muốn tạo đồng hồ Kỹ thuật số tùy chỉnh có 32 giờ thay vì 24 và mỗi giờ = 45 phút thay vì 60 phút

Công chúa

Xin chào, bạn có thể giúp tôi với logic. Tôi muốn tạo đồng hồ Kỹ thuật số tùy chỉnh có 32 giờ thay vì 24 và mỗi giờ = 45 phút thay vì 60 phút

zumizo

Bài báo tuyệt vời

Sergio Aguiar

Xin chào ngài. Tôi thực sự đánh giá cao bài viết đó là rất tốt và nhiều thông tin. Tuy nhiên, tôi có một câu hỏi về cách tính ngày giờ. Tôi có một bảng dữ liệu, trong đó có ngày giờ bắt đầu và ngày giờ kết thúc và tôi cần so sánh chúng để xem liệu thời gian hiện tại có nằm giữa hai thời điểm trên không (nếu thời gian hiện tại nhỏ hơn thời gian kết thúc và lớn hơn thời gian bắt đầu . Các mục dữ liệu có định dạng. 2020-03-12 12. 28. 54 Bạn có thể giúp tôi tìm cách làm cái này không?

Kashif Jaffri

Viết đẹp và rõ ràng. Rất hữu ích, cảm ơn đã chia sẻ

Kevin Bloch

I would think you could take the current time of day, calculate how many minutes have passed since midnight (minutes + hours*60), then divide by 45 for your new "hours" and use the remainder for the current minutes. The seconds (and anything smaller) would stay the same as on the normal clock.

Jon Seidel

Tôi thắc mắc về ví dụ chuyển đổi UTC mà bạn đã đưa ra ở đầu bài viết. "Tôi sống ở UTC+5. 45. Điều này có nghĩa là khi ở nơi tôi sống là 5 giờ chiều thì đó là 11. 15 giờ UTC. ". Theo tính toán của tôi, 5. 00 + 5. 45 sinh 10. 45 UTC, vậy làm thế nào để bạn đến lúc 11 giờ. 15 UTC?

Kevin Bloch

Good question. The article will be updated to make this a bit more explicit, but the math was, in fact, correct. When it's 5 PM where the author lives, since his timezone is UTC+05:45, that means to get back to UTC, we need to subtract 5:45, not add it. The result is 11:15 (AM) UTC. After that, when we go from UTC to Uppsala's UTC+01:00 timezone, then we're adding, so the final result is 12:15 PM Uppsala time. I hope that helps. :)

nhân đôi

Tôi phải hoàn toàn không đồng ý với bạn khi thực hiện các thao tác ngày tháng trong JavaScript. Nó chỉ có quá nhiều hạn chế. Thành thật mà nói, làm bất cứ điều gì với ngày tháng trong JavaScript thực sự tệ. Nó cũng có thể dẫn đến sự không nhất quán khi bạn phải thực hiện thao tác ngày tháng hoặc tra cứu ở mặt sau do một bộ quy tắc khác đang được tuân theo. Tôi sẽ lấy trang web của riêng tôi làm ví dụ. Đó là một trang web giúp lập kế hoạch và lên lịch các sự kiện. Thường thì những sự kiện này diễn ra ở múi giờ khác với vị trí hiện tại của người dùng. Vì vậy, ai đó có thể đăng nhập từ múi giờ miền Trung, nhưng đang lên kế hoạch cho một sự kiện ở múi giờ miền Đông. Điều này gần như không thể xử lý bằng JavaScript, vì không có cách nào để chuyển đổi thời gian từ vùng này sang vùng khác. Vì vậy, trang web của tôi có một cách tiếp cận khác. tất cả thời gian được liệt kê luôn theo múi giờ địa phương nơi sự kiện đang diễn ra. Nó cũng có ý nghĩa hơn, như mọi người nghĩ theo giờ địa phương, không phải theo giờ UTC, vậy tại sao lại thực hiện các chuyển đổi không cần thiết? . Nếu các chuyển đổi được thực hiện trong trình duyệt, số sẽ hiển thị là 8. 00 AM trong khi ở một múi giờ có thể hiển thị là 9. 00 giờ sáng khi ở múi giờ khác. Làm thế nào để người dùng biết giá trị nào là đúng? . Cũng có nhiều lúc giờ địa phương là thời điểm thích hợp để lưu trữ trong cơ sở dữ liệu. Trong trường hợp của tôi, tôi lưu trữ thời gian diễn ra sự kiện theo múi giờ địa phương. Nhưng mọi thứ khác (nhật ký hoạt động, v.v. ) là tất cả trong UTC. Điều này đặc biệt hữu ích khi tôi cần gửi email nhắc nhở -- chúng sẽ gửi đi dựa trên giờ địa phương của sự kiện. Nếu tôi phải chuyển đổi UTC trong cơ sở dữ liệu thành cục bộ mỗi khi tôi chạy truy vấn cơ sở dữ liệu, những truy vấn đó sẽ mất mãi mãi vì việc chuyển đổi phải được thực hiện cho mỗi hàng. Rất tốn thời gian. Vì vậy, tôi lưu trữ thời gian liên quan đến sự kiện theo giờ địa phương, thực hiện chuyển đổi múi giờ UTC sang múi giờ địa phương trước khi chạy truy vấn để xem cảnh báo nào có liên quan vào thời điểm đó. Điều này cho phép tôi tối ưu hóa hiệu suất với các chỉ mục trên các cột đó. Chắc chắn có nhiều lúc UTC có ý nghĩa, nhưng khi hiển thị thời gian cho người dùng trang web, giờ địa phương là cách tốt nhất. Chuyển đổi sang UTC khi cần thiết, nhưng phần lớn thời gian giờ địa phương có ý nghĩa hơn nhiều vì đó là những gì mọi người giải quyết trong thế giới thực

Volker Kleinschmidt

Không có vấn đề gì khi có các múi giờ không phải UTC trên máy chủ của bạn, miễn là mọi thứ nhất quán giữa múi giờ của hệ điều hành và múi giờ của cơ sở dữ liệu. Thực sự tốt hơn nhiều nếu máy chủ được định cấu hình theo múi giờ địa phương thích hợp cho máy khách có ứng dụng mà nó lưu trữ. Dẫn đến ít nhầm lẫn hơn khi quản trị viên hệ thống và người dùng cuối nói về các ngày trong cùng một múi giờ

Kevin Bloch

Đôi khi, có lẽ. Ngay cả ở đó cũng có khả năng xảy ra lỗi (như bạn đã đề cập, miễn là mọi thứ nhất quán—cuối cùng, điều đó phụ thuộc vào người đang quản lý các yếu tố đó và khả năng chúng bị quản lý sai, được quản lý khác bởi người mới, v.v. ) và tiền đề về một khách hàng thuộc một múi giờ duy nhất cũng không được đưa ra trong lực lượng lao động phân tán ngày nay, ngay cả đối với các khách hàng nhỏ hơn. Do đó chữ "U" trong UTC. ;) (Một điều khác cần xem xét là, nếu một ngày nào đó tình hình thay đổi, thì cũng sẽ có một số chi phí để chuyển mọi thứ sang UTC. Nhưng tôi thừa nhận, đây có thể là tối ưu hóa sớm trong một số trường hợp. )

Sai Swaroop Bedamatta

Xin chào, cảm ơn vì blog. Tôi có một truy vấn, tôi muốn hiển thị ngày và ngày tùy chỉnh như mỗi tuần thứ hai+ngày, thứ tư+ngày, thứ sáu+ngày. Làm thế nào tôi có thể làm điều đó?

inviscidpixels

Mr Punit Tôi chỉ muốn nói rằng đây là một bài viết hướng dẫn và được viết rất hay về những gì thường có thể là một cơn ác mộng, phân tích cú pháp và hình thành thời gian trên web. Không chỉ vậy, nó còn toàn diện đến mức nó cung cấp một nền tảng vững chắc cho nhà phát triển mới hoặc thậm chí là một người có kinh nghiệm cần tìm hiểu về chủ đề này. Cảm ơn. Hy vọng nỗ lực của bạn đang diễn ra tốt đẹp

Loại dữ liệu nào là thời gian trong JavaScript?

JavaScript không có kiểu dữ liệu ngày tháng . Tuy nhiên, bạn có thể sử dụng đối tượng Date và các phương thức của nó để làm việc với ngày và giờ trong các ứng dụng của mình. Đối tượng Date có một số lượng lớn các phương thức để thiết lập, nhận và thao tác ngày tháng.

Định dạng của thời gian là gì?

Hệ thống 24 giờ là định dạng mặc định. Thời gian dựa trên hệ thống 12 giờ. AM hoặc PM được đưa ra. Thời gian dựa trên hệ thống 24 giờ.

Định dạng mặc định cho thời gian là gì?

Định dạng thời gian là HH. MM. SS trong đó HH biểu thị giá trị giờ từ 0 đến 23, MM biểu thị giá trị phút có hai chữ số từ 00 đến 59 và SS biểu thị giá trị giây có hai chữ số từ 00 đến 59.

Định dạng ngày giờ là gì?

Bao gồm phần phân số, định dạng cho các giá trị này là ' YYYY-MM-DD hh. mm. ss [. phân số ]' , phạm vi cho giá trị DATETIME là '1000-01-01 00. 00. 00. 000000' đến '9999-12-31 23. 59. 59. 999999' và phạm vi cho các giá trị DẤU THỜI GIAN là '1970-01-01 00. 00. 01. 000000' đến '2038-01-19 03. 14. 07. 999999'.