成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

八個關于 new Date() 的陷阱,你需要知道一下

開發 前端
new Date() 構造函數是魔鬼 - 哦,我害怕它!這導致我在工作中犯了很多錯誤,其中一些非常奇怪。我們必須非常小心地對待它,否則我們很容易陷入它的陷阱。

new Date() 構造函數是魔鬼 - 哦,我害怕它!這導致我在工作中犯了很多錯誤,其中一些非常奇怪。

我們必須非常小心地對待它,否則我們很容易陷入它的陷阱。

1. Safari瀏覽器不支持YYYY-MM-DD形式的格式化日期

你知道嗎?“Safari”瀏覽器不支持“YYYY-MM-DD”形式的初始化時間。除它之外的很多瀏覽器,例如Chrome瀏覽器,都完美支持這種格式。

如果您編寫這樣的代碼,您的應用程序將在“Safari”瀏覽器中收到無效日期錯誤。

new Date('2023-05-28') // Invalid Date

為了正確處理這個問題,我們需要以“YYYY/MM/DD”的形式初始化時間。

new Date('2023/05/28')

2.使用0作為月份的起始索引

我們應該如何初始化日期 2023 年 5 月 28 日?

const d = new Date(2023, 4, 28)


console.log(d.getMonth()) // 4

我們將 4 作為第二個參數傳遞給 Date,但為什么不傳遞 5?

啊! 我討厭這個功能。處理月份時,日期以 0 開頭,0 表示一月,1 表示二月,等等。這個函數很糟糕,非常混亂且有錯誤。

3.關于其自動日期校正的陷阱

很難猜測下面的代碼代表的真實日期是什么。

也許是 2023 年 2 月的日期?但二月并沒有32天,很奇怪,那么到底是什么呢?

const d = new Date(2023, 1, 32)

讓我們編寫一個解析日期對象的函數。

const parseDate = (date) => {
  const year = date.getFullYear()
  const month = date.getMonth() + 1 //Since the index of the month starts from 0, we need to add 1
  const day = date.getDate()


  return { year, month, day }
}


console.log(parseDate(new Date(2023, 1, 32)))
/*
{
  "year": 2023,
  "month": 3,
  "day": 4
}
*/

哦,新的日期(2023, 1, 32)是2023年3月4日,這太離譜了。

4. 無法輕松格式化日期?

如何將數組轉換為指定格式的字符串?很簡單,我們可以使用數組的join方法。

const array = [ '2023', '5', '28' ]


console.log(array.join('/')) // 2023/5/28
console.log(array.join('-')) // 2023-5-28
console.log(array.join(':')) // 2023:5:28

但是Date對象并沒有提供直接方便的方式來格式化日期,所以我們必須自己編寫代碼來實現。

const formatDate = (date, format = '/') => {
  return date.getFullYear() + format + (date.getMonth() + 1) + format + date.getDate()
}


formatDate(new Date(2023, 4, 28), ':') // 2023:5:28
formatDate(new Date(2023, 4, 28), '/') // 2023/5/28
formatDate(new Date(2023, 4, 28), ':') // 2023-5-28

5. 無法確定日期對象是否有效

就像上面的例子一樣,由于Date對象會自動固定日期,所以,我們無法判斷一個日期是否真的有效。

const d = new Date(2023, 15, 1) // this is a date that does not exist


formatDate(d) // 2024/4/1

6. string類型的日期無法正確解析

很多時候我們會通過傳遞日期字符串來初始化日期,因為它比 new Date(2023, 4, 28) 使用起來方便得多。

const d1 = new Date('2023-5-28')


console.log(formatDate(d1)) // 2023/5/28

這里也有陷阱,我的朋友,我們必須小心。

const d2 = new Date('5-28-2023')


console.log(formatDate(d2)) // 2023/5/28

如果您傳入這樣的日期,您將收到無效錯誤警告。

const d3 = new Date('28-5-2023') // Invalid Date
const d4 = new Date('2023-28-5') // Invalid Date

7. 無法判斷Date是否為閏年

哇,有時我們需要在工作中確定一年是否是閏年,這有點麻煩,因為 Date 對象也沒有提供執行此操作的對象方法。

const isLeapYear = (date) => {
  const year = date.getFullYear()
  return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0
}


isLeapYear(new Date(2023, 4, 28)) // false
isLeapYear(new Date(2020, 4, 28)) // true

8. 新日期(xx, xx, xx) 是一年中的哪一周?

Date對象提供了獲取年、月、日、小時、分鐘等的函數。

我們如何確定日期是一年中的第幾周?我們只能通過復雜的計算來完成這個目標。

const getWeekNumber = (date) => {
  // Creates a new Date object, set to a copy of the given date
  const newDate = new Date(date.getTime())
  // Set the time part of the date object to 0 so that only the date is considered
  newDate.setHours(0, 0, 0, 0)
  // Sets the date object to the first day of the year
  newDate.setDate(1)
  newDate.setMonth(0)
  // Gets the day of the week for the first day (0 for Sunday, 1 for Monday, etc.
  const firstDayOfWeek = newDate.getDay()
  // Calculates the difference in days from a given date to the start of the first week
  const diff = (date.getTime() - newDate.getTime()) / (24 * 60 * 60 * 1000)
  // Determines the start date of the first week according to the ISO 8601 standard
  let weekStart = 1 - firstDayOfWeek
  if (firstDayOfWeek > 4) {
    weekStart += 7 // If the first day is a Friday or later, move the first week back by one week
  }
  // Calculate week number (rounded down)
  const weekNumber = Math.floor((diff + weekStart) / 7) + 1
  return weekNumber
}


getWeekNumber(new Date(2023, 4, 28)) // 22

這是一種常見的計算,使用 ISO 8601 標準來計算日期是一年中的第幾周。

但顯然,它太復雜了,我無法理解這個功能。

寫在最后

Date對象有很多奇怪的行為,我們可以使用一些強大的庫來幫助我們。例如Moment.js、Day.js、date-fns等。

責任編輯:華軒 來源: web前端開發
相關推薦

2025-03-17 00:33:00

2023-02-10 08:44:05

KafkaLinkedIn模式

2022-09-01 15:26:45

物聯網人工智能傳感器

2023-01-30 11:43:04

開源代碼

2018-06-15 23:00:56

2017-09-18 18:31:08

Hadoop

2022-04-24 09:00:00

滲透測試安全數字時代

2022-12-30 11:24:21

2017-02-09 14:46:25

Git事情

2022-07-15 14:58:26

數據分析人工智能IT

2023-01-06 16:43:18

產品戰略產品策略

2014-07-31 17:13:50

編碼程序員

2023-12-28 17:50:00

前端開發

2012-11-01 11:11:36

Web設計Web設計

2022-08-27 12:15:51

Linux Mint操作系統

2022-07-27 10:06:04

數字化轉型混合工作

2019-05-22 15:10:43

2017-04-29 09:00:14

Linux程序進程

2015-06-30 10:59:22

MobileWeb適配

2022-11-28 00:07:47

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜寂寞影院在线观看 | 久久综合狠狠综合久久综合88 | 成人毛片一区二区三区 | 欧美色综合一区二区三区 | 成人av免费 | 在线观看www高清视频 | 欧美一级二级在线观看 | 欧美a在线 | 亚洲欧美成人影院 | 色婷婷精品国产一区二区三区 | 精品久久久久久久久久久下田 | 国产一区二区三区视频 | 日韩成人 | 99精品欧美一区二区蜜桃免费 | 国产激情视频网址 | 北条麻妃99精品青青久久 | 国产1区 | 欧美 视频 | 国产成人久久精品一区二区三区 | 久久伊人免费视频 | 欧美无乱码久久久免费午夜一区 | 国产日产欧产精品精品推荐蛮挑 | 天天色综| 九九精品在线 | 亚洲色图图片 | 免费国产精品久久久久久 | 黄色在线观看 | 婷婷在线网站 | 日韩成人| 五月激情婷婷网 | 日韩中文字幕网 | 免费观看一级特黄欧美大片 | 欧美性网 | 啪啪综合网 | 精品1区2区 | 日韩一区二区三区视频 | 综合二区 | 精品乱码一区二区 | 正在播放国产精品 | 中文字幕不卡在线观看 | 中文字幕精品一区二区三区精品 |