Định dạng thời gian JavaScript

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 tình trạng khó hiểu về 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. When it doesn’t, what happens when the rules your database engine uses don’t match those of your front or back end?

This problem of managing two different versions of the time, relative to the user and relative to a universally accepted standard, is difficult, even more so in the world of programming where precision is key and even one second can make a huge difference. The first step towards solving these issues is to store DateTime in UTC

Standardizing the Format

Standardizing the time is wonderful because I only need to store the UTC time and as long as I know the time zone of the user, I can always convert to their time. Conversely, if I know a user’s local time and know their time zone, I can convert that to UTC

But dates and times can be specified in many different formats. For the date, you could write “Jul 30th” or “30 July” or “7/30” (or 30/7, depending on where you live). For the time, you could write “9. 30 PM” or “2130”

Scientists all over the world came together to tackle this problem and decided on a format to describe time that programmers really like because it’s short and precise. We like to call it “ISO date format,” which is a simplified version of the ISO-8601 extended format and it looks like this

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

For 00. 00 or UTC, we use “Z” instead, which means Zulu time, another name for UTC

Date Manipulation and Arithmetic in JavaScript

Before we start with best practices, we will learn about date manipulation using JavaScript to get a grasp of the syntax and general concepts. Although we use JavaScript, you can adapt this information to your favorite programming language easily

We will use date arithmetic to solve common date-related problems that most developers come across

My goal is to make you comfortable creating a date object from a string and extracting components out of one. This is something that a date library can help you with, but it’s always better to understand how it is done behind the scenes

Once we’ve gotten our hands dirty with date/time, it is then easier to think about the problems we face, extract the best practices, and move ahead. If you want to skip to the best practices, feel free to do so, but I would highly recommend you to at least skim through the date-arithmetic section below

The JavaScript Date Object

Programming languages contain useful constructs to make our lives easier. The JavaScript

const date = new Date(2016, 6, 27, 13, 30, 0);
9 object is one such thing. It offers convenient methods to get the current date and time, store a date in a variable, perform date arithmetic, and format the date based on the user’s locale

Due to differences between browser implementations and incorrect handling of Daylight Savings Time (DST), depending on the Date object for mission-critical applications is not recommended and you should probably be using a DateTime library like Luxon, date-fns, or dayjs. (Whatever you use, avoid the once-popular Moment. js—often simply called

const date = new Date("2016-07-27T07:45:00Z");
0, as it appears in code—since it’s now deprecated. )

But for educational purposes, we will use the methods that the Date() object provides to learn how JavaScript handles DateTime

Getting Current Date

const currentDate = new Date();

If you don’t pass anything to the Date constructor, the date object returned contains the current date and time

You can then format it to extract only the date part as follows

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ú. The “January is 0” pitfall is common but not universal. It’s worth double-checking the documentation of any language (or configuration format. e. g. , cron is notably 1-based) before you start using it

Getting the Current Time Stamp

If you instead want to get the current time stamp, you can create a new Date object and use the getTime() method

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

In JavaScript, a time stamp is the number of milliseconds that have passed since January 1, 1970

If you don’t intend to support const date = new Date("2016-07-27T07:45:00Z"); 1 to directly get the time stamp without having to create a new Date object

Parsing a Date

Converting a string to a JavaScript date object is done in different ways

The Date object’s constructor accepts a wide variety of date formats

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

Note that you do not need to include the day of week because JS can determine the day of the week for any date

You can also pass in the year, month, day, hours, minutes, and seconds as separate arguments

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

Of course, you can always use ISO date format

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

If you need to support older browsers like IE before version 11, date formatting in JavaScript is tougher because there were no standard date-formatting functions like

const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
2 in Python or PHP

In PHP for example, the function

const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
3 gives you
const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
4

You can use a different combination of letters preceded by

const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
5 to get the date in different formats. (Careful, not every language assigns the same meaning to each letter—particularly, 'M' and 'm' may be swapped for minutes and months. )

If you are sure of the format you want to use, it is best to extract individual bits using the JavaScript functions we covered above and create a string yourself

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

The problem with this solution is that it can give an inconsistent length to the dates because some months and days of the month are single-digit and others double-digit. This can be problematic, for example, if you are displaying the date in a table column, because the dates don’t line up

We can address this by using a “pad” function that adds a leading 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"
4

Now, we get the correct date in MM/DD/YYYY format using

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

If we want DD-MM-YYYY instead, the process is similar

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

Let’s up the ante and try to print the date in “Month Date, Year” format. We will need a mapping of month indexes to names

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

Some people like to display the date as 1st January, 2013. No problem, all we need is a helper function

const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
6 that returns 1st for 1, 12th for 12, and 103rd for 103, etc. , and the rest is simple

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

It is easy to determine the day of week from the date object, so let’s add that in

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

The bigger point here is, once you’ve got the numbers extracted from the date, the formatting is mostly related to strings

Changing the Date Format

Once you know how to parse a date and format it, changing a date from one format to another is just a matter of combining the two

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

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

Using JavaScript Date Object’s Localization Functions

The date formatting methods we discussed above should work in most applications, but if you really want to localize the formatting of the date, I suggest you use the

const date = new Date(2016, 6, 27, 13, 30, 0);
9 object’s
const date1 = new Date("25 July 2016");
const date2 = new Date("July 25, 2016");
8 method

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ớ 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
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, đ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 vĩnh viễn.

“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 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ẽ đ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. 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 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

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 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 của thời gian là gì?

định dạng thời gian

Định dạng ngày tháng DD MMM YYYY JavaScript là gì?

Không có định dạng gốc trong JavaScript cho “dd-mmm-yyyy” . Để lấy định dạng ngày “dd-mmm-yyyy”, chúng ta sẽ sử dụng biểu thức chính quy trong JavaScript.

Định dạng ngày nào là TZ?

T giữa ngày và giờ là bao nhiêu? . Nếu chuỗi của bạn luôn có chữ “Z”, bạn có thể sử dụng. Định dạng SimpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd'T'HH. mm. ss). zero hour offset” also known as “Zulu time” (UTC). If your strings always have a “Z” you can use: SimpleDateFormat format = new SimpleDateFormat( “yyyy-MM-dd'T'HH:mm:ss).

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