Định dạng ngày giờ JavaScript

Định dạng ngày JavaScript là một điều phổ biến. Có một chuỗi ngày và giờ ở khắp mọi nơi trên các trang web. Một số lượng đáng kể ngày nộp đơn được định dạng bằng mã JavaScript

Có một số phương pháp và thư viện được sử dụng để định dạng ngày tháng. Hãy xem xét từng người trong số họ một cách riêng biệt

Khoảng khăc. js là một trong những thư viện ngày/giờ tốt nhất. Nó rất dễ sử dụng, được ghi lại đầy đủ và có kích thước nhỏ gọn (20kb). Nó hoạt động với cả Node. js và JavaScript, điều này thật tuyệt vì bạn không phải học nhiều thư viện ngày/giờ để lập trình front-end và back-end

moment().format('YYYY-MM-DD HH:m:s'); // now() -> 2020-03-20 14:32:20
moment("20161031", "YYYYMMDD").fromNow(); // 3 years ago
moment("20170620", "YYYYMMDD").fromNow(); // 3 years ago
moment().startOf('day').fromNow(); // 11 hours ago
moment().endOf('day').fromNow(); // in 13 hours

Các. format() xây dựng một chuỗi mã thông báo đề cập đến một thành phần cụ thể của ngày (như ngày, tháng, phút hoặc sáng/chiều)

Định dạng ngày tháng tương tự như phương pháp trước theo cách nó định dạng ngày tháng bằng cách sử dụng chuỗi mã thông báo. Trong trường hợp datetime phía trình duyệt sẽ mở rộng đối tượng Date để có. phương thức định dạng()

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'

Tuy nhiên, nó hoạt động khác với Node. phiên bản js. Bạn nên sử dụng định dạng ngày làm phương thức và chuyển đối tượng Ngày

const dateformat = require('dateformat');
let now = new Date();
dateformat(now, 'dddd, mmmm dS, yyyy, h:MM:ss TT');
'Tuesday, Feb 2nd, 2020, 4:30:20 PM'

Đây là một phương pháp không chuẩn, nhưng đôi khi, đây có thể là lựa chọn duy nhất. Phương pháp này chỉ được hỗ trợ trong các phiên bản sau của một số trình duyệt. Tuy nhiên, trong trường hợp của Node, nó có thể là một lựa chọn tốt. Không giống như hai phương pháp trên, Date. toLocaleString() không sử dụng chuỗi mã thông báo. Nó sử dụng một đối tượng tùy chọn trong đó mỗi phần của ngày có thể được cấu hình. Việc định dạng có thể được thực hiện. toLocaleString()

let today = new Date();
today.toLocaleFormat('%d-%b-%Y'); // 30-Jun-2020

Nếu giờ, phút và giây nhỏ hơn 9, bạn nên thực hiện các thao tác bổ sung để thêm các số 0 đứng đầu trong DateTime. Bạn nên thêm một phương thức tùy chỉnh để nối các số 0 đứng đầu trong DateTime

Định dạng ngày giờ JavaScript
Javascript thêm số không vào DateTime

hàm addLeadingZeros(n) { if (n <= 9) { return "0" + n; . nhật ký (hiện tạiDatetime. toString()); . getFullYear() + "-" + addLeadingZeros(currentDatetime. getMonth() + 1) + "-" + addLeadingZeros(currentDatetime. getDate()) + " " + addLeadingZeros(currentDatetime. getHours()) + ". " + addLeadingZeros(currentDatetime. getMinutes()) + ". " + addLeadingZeros(currentDatetime. bảng điều khiển getSeconds()). nhật ký (ngày định dạng);

Đối tượng Date được sử dụng để biểu thị ngày và giờ trong JavaScript. Nó bao gồm cả hai. Theo quy định, các tháng bắt đầu từ 0 và kết thúc bằng 11. Các ngày trong tuần cũng được tính bắt đầu từ số không. Trong JavaScript, các ngày có thể được trừ đi và đưa ra sự khác biệt của chúng tính bằng mili giây, vì Ngày được chuyển đổi thành dấu thời gian khi được chuyển đổi thành số. Dấu thời gian tính bằng mili giây, không phải giây

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

ĐĂNG LẠI

ĐĂNG LẠI

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, đâ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 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, một 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ư Luxon, date-fns hoặc dayjs. (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()

________số 8

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
0

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
3

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
4

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
8

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 dateformat = require('dateformat');
let now = new Date();
dateformat(now, 'dddd, mmmm dS, yyyy, h:MM:ss TT');
'Tuesday, Feb 2nd, 2020, 4:30:20 PM'
0

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 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
today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
30

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,

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
31 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 (tô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ư

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
32 trong Python hoặc PHP

Ví dụ, trong PHP, hàm

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
33 cung cấp cho bạn
today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
34

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
35 để 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ể cho độ dài ngày không nhất quán 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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
36 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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
38 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ư

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
39

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
38, 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à

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
42. 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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
43. 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____84"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à

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
44 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,
today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
44 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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
46 và
today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
47 để 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:

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
00

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
01

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
48

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
02

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
03

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,

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
49 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
today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
04

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
05

Nhớ lại. 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
today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
06

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
07

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
08

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
09

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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
81 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. ,

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
83 giống như
today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
84 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

today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
86 hoặc
today = new Date();
today.format('dd-m-yy'); // Returns '02-8-16'
87 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
    today = new Date();
    today.format('dd-m-yy'); // Returns '02-8-16'
    89 hoặc
    today = new Date();
    today.format('dd-m-yy'); // Returns '02-8-16'
    38 và
    const dateformat = require('dateformat');
    let now = new Date();
    dateformat(now, 'dddd, mmmm dS, yyyy, h:MM:ss TT');
    'Tuesday, Feb 2nd, 2020, 4:30:20 PM'
    01 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, điều quan trọng là phải biết múi giờ xảy ra 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 giờ ă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 dateformat = require('dateformat');
let now = new Date();
dateformat(now, 'dddd, mmmm dS, yyyy, h:MM:ss TT');
'Tuesday, Feb 2nd, 2020, 4:30:20 PM'
02 của đối tượng Date cho chúng ta biết số phút mà 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 dateformat = require('dateformat');
let now = new Date();
dateformat(now, 'dddd, mmmm dS, yyyy, h:MM:ss TT');
'Tuesday, Feb 2nd, 2020, 4:30:20 PM'
03

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

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

const dateformat = require('dateformat');
let now = new Date();
dateformat(now, 'dddd, mmmm dS, yyyy, h:MM:ss TT');
'Tuesday, Feb 2nd, 2020, 4:30:20 PM'
04 ở đâ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ẽ đi kèm với tập hợp các sắc thái riêng—đ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ẻ

Thao tác JavaScriptDatetime

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

Thông tin về các 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 thời điểm. 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 thời điểm. 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. I felt that, actual soul of the article(Backend should have ISO formatted datetime and frontend should take care of converting the ISO format to user friendly local datetime) got lost into too many code snippets. EDIT. "Always configure your servers and databases to use GMT/UTC timezone. " I think this is not needed. Because server will always going to receive ISO formatted date

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. I felt that, actual soul of the article(Backend should have ISO formatted datetime and frontend should take care of converting the ISO format to user friendly local datetime) got lost into too many code snippets. EDIT. "Always configure your servers and databases to use GMT/UTC timezone. " I think this is not needed. Because server will always going to receive ISO formatted date

Trừng phạt Jajodia

Thank you for the encouraging words Ashish . )

Trừng phạt Jajodia

Thank you for the encouraging words Ashish . )

Anit Shrestha Manandhar

Nice read. Thanks Punit

Anit Shrestha Manandhar

Nice read. Thanks Punit

Vadim

Thanks for nice article, Punit. Working with datetime always causes problem (for me. I think, I am not exception). Your article makes this process not so painful . )

Vadim

Thanks for nice article, Punit. Working with datetime always causes problem (for me. I think, I am not exception). Your article makes this process not so painful . )

Andy Hubert

Small, but important, typo. You wrote ". if you create a Date object with the input invalid [NO SPACE] ISO date format. " but meant ". if you create a Date object with the input in valid [WITH SPACE] ISO date format. "

Andy Hubert

Small, but important, typo. You wrote ". if you create a Date object with the input invalid [NO SPACE] ISO date format. " but meant ". if you create a Date object with the input in valid [WITH SPACE] ISO date format. "

millermedeiros

có một vài vấn đề với các ví dụ ở đây. TL;DR; date time in JavaScript is hard. I won't go over everything but a couple notes. doing any kind of arithmetic is error prone. The way you calculate `daysDiff` will be wrong if there is a DST transition in between the dates. The correct way to implement it is to use the total days in month for each month in between or simply discard the time information and use the UTC date to compute the difference. everyone gets it wrong (see my comment here. https. //github. com/moment/moment/pull/571#issuecomment-16301301) There is also a bug on Firefox for things like `date. setDate(date. getDate() + 3)` related to DST. https. //bugzilla. mozilla. org/show_bug. cgi?id=1084434 (Safari and Chrome had the same issue but got fixed a couple years ago) `getTimeZoneOffset` is a foot-gun; it will return different value depending if current day is on daylight savings time or not. - proper way is to actually have the timezone as a user setting and not use offsets to calculate it at all (use some backend library/language that have an up-to-date timezone/DST transition table). - timezones in the font-end is hard (see. http. //stackoverflow. com/a/37798868 and https. //en. wikipedia. org/wiki/Tz_database) So if you want to avoid issues, you're better of using just the UTC date methods in JavaScript; if you don't need the time information I would even consider storing it just as a plain `{day. 4, month. 10, year. 2016}` and not use `new Date()`

millermedeiros

có một vài vấn đề với các ví dụ ở đây. TL;DR; date time in JavaScript is hard. I won't go over everything but a couple notes. doing any kind of arithmetic is error prone. The way you calculate `daysDiff` will be wrong if there is a DST transition in between the dates. The correct way to implement it is to use the total days in month for each month in between or simply discard the time information and use the UTC date to compute the difference. everyone gets it wrong (see my comment here. https. //github. com/moment/moment/pull/571#issuecomment-16301301) There is also a bug on Firefox for things like `date. setDate(date. getDate() + 3)` related to DST. https. //bugzilla. mozilla. org/show_bug. cgi?id=1084434 (Safari and Chrome had the same issue but got fixed a couple years ago) `getTimeZoneOffset` is a foot-gun; it will return different value depending if current day is on daylight savings time or not. - proper way is to actually have the timezone as a user setting and not use offsets to calculate it at all (use some backend library/language that have an up-to-date timezone/DST transition table). - timezones in the font-end is hard (see. http. //stackoverflow. com/a/37798868 and https. //en. wikipedia. org/wiki/Tz_database) So if you want to avoid issues, you're better of using just the UTC date methods in JavaScript; if you don't need the time information I would even consider storing it just as a plain `{day. 4, month. 10, year. 2016}` and not use `new Date()`

Khaled Monsoor

nice read. But, there're some issues. for example, output of your first line of code `var date = new Date("July 32, 2016 15. 00. 00 GMT");` is wrong, at least on latest Chrome & Firefox. While it definitely don't throw an exception, but it sets the `date` to `Invalid Date`

Khaled Monsoor

nice read. But, there're some issues. for example, output of your first line of code `var date = new Date("July 32, 2016 15. 00. 00 GMT");` is wrong, at least on latest Chrome & Firefox. While it definitely don't throw an exception, but it sets the `date` to `Invalid Date`

juanvillegas

I think what he means by configuring the server in UTC is that otherwise, if you were to create a new date you would have to explicitly tell your backend language (ie. php) that its a UTC. Same for the database, all automatically generated datetimes would be in something that is not UTC, which is a problem

juanvillegas

I think what he means by configuring the server in UTC is that otherwise, if you were to create a new date you would have to explicitly tell your backend language (ie. php) that its a UTC. Same for the database, all automatically generated datetimes would be in something that is not UTC, which is a problem

Trừng phạt Jajodia

Thanks for sharing the link to the issue with date difference calculation. It will be an extra reference to the readers. Date Arithmetic is complex, even more so when DST transitions are involved. When writing the article, I had to deliberately keep DST out of the loop to keep the article from being too long. You'll obviously need the help of a library to make sure that your DateTime calculations work with reasonable accuracy. The methods and the code snippets I have shown are supposed to be more educational than industry-standard code. If you've noticed, I haven't actually used the the value I get from getTimeZoneOffset() in the example that needs the local time and kept it only as a meta-data to be used for debugging. Again, an article the same length as this one could be written just about this. If you are storing the timezone as a user setting, then the UTC date methods in JavaScript should suffice and new Date() can be avoided altogether

Trừng phạt Jajodia

Thanks for sharing the link to the issue with date difference calculation. It will be an extra reference to the readers. Date Arithmetic is complex, even more so when DST transitions are involved. When writing the article, I had to deliberately keep DST out of the loop to keep the article from being too long. You'll obviously need the help of a library to make sure that your DateTime calculations work with reasonable accuracy. The methods and the code snippets I have shown are supposed to be more educational than industry-standard code. If you've noticed, I haven't actually used the the value I get from getTimeZoneOffset() in the example that needs the local time and kept it only as a meta-data to be used for debugging. Again, an article the same length as this one could be written just about this. If you are storing the timezone as a user setting, then the UTC date methods in JavaScript should suffice and new Date() can be avoided altogether

Trừng phạt Jajodia

Thanks for pointing it out. I've fixed it. . )

Trừng phạt Jajodia

Thanks for pointing it out. I've fixed it. . )

Trừng phạt Jajodia

I am happy the article is useful. Don't forget to use it as an educational content and use a library like moment. js whenever possible

Trừng phạt Jajodia

I am happy the article is useful. Don't forget to use it as an educational content and use a library like moment. js whenever possible

tapfumamanhanga

Great article indeed. I faced a lot challenges trying to handle dates in an online point of sale project. It involved a lot of date functions and date arithmetic which I somehow miraculously managed to overcome. After reading this article there are a number of basic concepts I picked that will help me in future projects

tapfumamanhanga

Great article indeed. I faced a lot challenges trying to handle dates in an online point of sale project. It involved a lot of date functions and date arithmetic which I somehow miraculously managed to overcome. After reading this article there are a number of basic concepts I picked that will help me in future projects

Michael Haephrati

I wrote an article about that http. //www. codeproject. com/Articles/792931/Date-time-batch-changer-for-photos-and-other-files

Michael Haephrati

I wrote an article about that http. //www. codeproject. com/Articles/792931/Date-time-batch-changer-for-photos-and-other-files

David Bruchmann

There are many limitations concerning dates related to the tools and formats you're using. The most well-known limitation is the timestamp, starting at 1. 1. 1970. In many applications records have this date if the user never enters a date. The more time passes, the more the situation gets unclear and the more it's probable that the zero-value leads to confusion and is interpreted wrong. If someone is born on that day at 0. 00 its probable that his birth-date-time will be interpreted as empty / not entered. There are still more limitations, depending on the years. 1900, 1000, 0, etc. 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 tháng 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

There are many limitations concerning dates related to the tools and formats you're using. The most well-known limitation is the timestamp, starting at 1. 1. 1970. In many applications records have this date if the user never enters a date. The more time passes, the more the situation gets unclear and the more it's probable that the zero-value leads to confusion and is interpreted wrong. If someone is born on that day at 0. 00 its probable that his birth-date-time will be interpreted as empty / not entered. There are still more limitations, depending on the years. 1900, 1000, 0, etc. 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 tháng 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. 45UTC, vậy làm thế nào để bạn đến 11. 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 nền tảng vững chắc cho nhà phát triển mới hoặc thậm chí là 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

Định dạng ngày nào là dd mm yyyy trong JavaScript?

Để định dạng ngày là dd/mm/yyyy. Sử dụng các phương thức getDate() , getMonth() và getFullYear() để lấy ngày, tháng và năm của ngày . Thêm số 0 ở đầu vào chữ số ngày và tháng nếu giá trị nhỏ hơn 10.

Định dạng cho datetime là gì?

Định dạng ngày và giờ

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

YYYY-MM-DD – là ngày. năm tháng ngày. Ký tự "T" được sử dụng làm dấu phân cách. HH. mm. ss. sss – đã đến lúc. giờ, phút, giây và mili giây.

Cách chuyển đổi YYYY

Để chuyển đổi chuỗi dd/mm/yyyy thành ngày tháng. Tách chuỗi trên mỗi dấu gạch chéo lên để có ngày, tháng và năm. Chuyển năm, tháng trừ 1 và ngày cho hàm tạo Date() . Hàm tạo Date() tạo và trả về một đối tượng Date mới.