日期实用程序(Date Utils)

Quasar提供了一组有用的函数,可以在大多数使用情况下轻松操作JS Date,而不需要像Momentjs那样集成专用库的额外成本。

大多数Quasar日期函数将参数指定为一个Unix时间戳或一个表示日期(需要由原生JS的Date constructor解析)的字符串。 一些例子: 1497159857411, Sun Jun 11 2017 08:44:42 GMT+0300, 2017-06-16.

返回值都是JS日期。

熟悉JS本地Date类,它非常强大,并且记住,你不需要像Momentjs这样的解决方案,它可以将数百个缩小的KB添加到你的包中。

TIP

除了UMD版本之外,Quasar日期实用程序包括tree shaking。

你会注意到所有的例子都会从Quasar中导入date对象。 但是,如果您只需要一种方法,那么您可以使用ES6解构来帮助Tree Shaking嵌入该方法而不是所有的date

addToDate()的例子:

// 我们导入所有的`date`
import { date } from 'quasar'
// 解构只保留需要的东西
const { addToDate } = date

let newDate = addToDate(new Date(), { days: 7, month: 1 })

TIP

有关UMD版本的使用,请参见此处.

显示格式

它接收一串令牌并用相应的日期值替换它们:

import { date } from 'quasar'

let timeStamp = Date.now()
let formattedString = date.formatDate(timeStamp, 'YYYY-MM-DDTHH:mm:ss.SSSZ')

对于i18n,您可以使用第三个参数:

let formattedString = date.formatDate(timeStamp, 'MMMM - dddd', {
  days: ['Duminica', 'Luni', /* 以及所有其余的日子 - 记得从星期天开始*/],
  daysShort: ['Dum', 'Lun', /* 以及所有其余的日子 - 记得从星期天开始 */],
  months: ['Ianuarie', 'Februarie', /* 和所有其余的几个月 */],
  monthsShort: ['Ian', 'Feb', /* 和所有其余的几个月 */]
})

可用的格式标记:

单位可用格式
年份
  • YY: 70 71 … 29 30
  • YYYY: 1970 1971 … 2029 2030
  • M: 1 2 … 11 12
  • MM: 01 02 … 11 12
  • MMM: Jan Feb … Nov Dec
  • MMMM: January February … November December
  • Q: 季度编号 1 2 3 4
  • Qo: 季度编号 1st 2nd 3rd 4th
月的一天
  • D: 1 2 … 30 31
  • Do: 1st 2nd … 30th 31st
  • DD: 01 02 … 30 31
年的一天
  • DDD: 1 2 … 364 365
  • DDDD: 001 002 … 364 365
星期几
  • d: 0 1 … 5 6
  • dd: Su Mo … Fr Sa
  • ddd: Sun Mon … Fri Sat
  • dddd: Sunday Monday … Friday Saturday
星期几 (ISO)
  • E: 1 2 … 6 7
年的一周
  • w: 1 2 … 52 53
  • ww: 01 02 … 52 53
小时
  • H: 0 1 … 22 23
  • HH: 00 01 … 22 23
  • h: 0 … 11 12
  • hh: 01 02 … 11 12
分钟
  • m: 0 1 … 58 59
  • mm: 00 01 … 58 59
  • s: 0 1 … 58 59
  • ss: 00 01 … 58 59
分数秒
  • S: 0 1 … 8 9
  • SS: 00 01 … 98 99
  • SSS: 000 001 … 998 999
时区偏移
  • Z: -07:00 -06:00 … +06:00 +07:00
  • ZZ: -0700 -0600 … +0600 +0700
AM/PM
  • A: AM, PM
  • a: am, pm
  • aa: a.m, p.m
Unix时间戳
  • X: 1360013296
  • x (ms): 1360013296123

操作日期

创建

尝试使用原生JS Date类创建日期,如下所示:

let date = new Date();

以下方法仅仅是一个封装,可以帮助您在有年份、月份或秒等情况下获取到当前时间。

import { date } from 'quasar'

let newDate = date.buildDate({ year:2010, day:5, hours:15, milliseconds:123})

您可以传递第二个参数(布尔值)来设置UTC时间(true)而不是本地时间。

提供的对象字面值可以包含以下键(都是可选的):

Key说明
milliseconds为日期/时间的毫秒部分
seconds为日期/时间的秒部分
minutes为日期/时间的分钟部分
hours用于日期/时间的小时部分
day为日期/时间的日期部分
month为日期/时间的月份部分
year为日期/时间的年份部分

验证

要检查日期字符串是否有效,请使用:

import { date } from 'quasar'

let dateString = 'Wed, 09 Aug 1995 00:00:00 GMT'
if (date.isValid(dateString)) {
  // 用dateString做一些事情
}

加/减

在日期中添加/减去一些持续时间,请使用:

import { date } from 'quasar'

let newDate  = new Date(2017, 2, 7)

newDate  = date.addToDate(newDate , { days: 7, months: 1 })
// `newDate ` 现在是 2017-3-14 00:00:00

newDate  = date.subtractFromDate(newDate , { hours: 24, milliseconds: 10000 })
// `newDate ` 现在是 2017-3-12 23:59:50

提供的对象字面值可以包含以下键(都是可选的):

Key说明
milliseconds持续几毫秒
seconds持续几秒
minutes持续几分钟
hours持续几小时
days持续几天
month持续几个月
year持续几年

设置日期/时间

设定日期/时间的指定单位:

import { date } from 'quasar'

let newDate  = new Date(2017, 10, 2)
let adjustedDate = date.adjustDate(newDate, { year: 2010, month: 2 })
// `adjustedDate` 是 2010-2-2

您可以传递第三个参数(布尔值)来设置UTC时间(true)而不是本地时间。

提供的对象字面值可以包含以下键(都是可选的):

Key说明
milliseconds为日期/时间的毫秒部分
seconds为日期/时间的秒部分
minutes为日期/时间的分钟部分
hours用于日期/时间的小时部分
days为日期/时间的日期部分
month为日期/时间的月份部分
year为日期/时间的年份部分

查询日期

最小/最大

要获取日期集(即数组)的最小/最大日期,请使用:

import { date } from 'quasar'

let min = date.getMinDate(new Date(2017, 6, 24), new Date(2017, 5, 20), new Date(2017, 6, 26))
// `min` 是 2017-5-20
let max = date.getMaxDate(new Date(2017, 6, 24), new Date(2017, 5, 20), new Date(2017, 6, 26))
// `max` 是 2017-6-26

//或使用数组
let dates = [ new Date(2017, 6, 24), new Date(2017, 5, 20), new Date(2017, 6, 26) ]
let min = date.getMinDate(dates) // `min` 是 2017-5-20
let max = date.getMaxDate(dates) // `max` 是 2017-6-26

请注意,返回值是一个时间戳。

console.log(max) // 1497906000000
console.log(new Date(max)) // Wed Jul 26 2017 00:00:00 GMT+0300 (Eastern European Summer Time)

时间范围

要检查日期是否在给定的日期/时间范围内,请使用:

import { date } from 'quasar'

let dateTarget = new Date()
let dateFrom = new Date()
let dateTo = new Date()

// **严格**(即专属范围)
if (date.isBetweenDates(dateTarget, dateFrom, dateTo)) {
  // 用dateTarget做些事情
}

// 包括你想要哪个margin
if (date.isBetweenDates(dateTarget, dateFrom, dateTo, { inclusiveFrom: true, inclusiveTo: true })) {
  // 用dateTarget做些事情
}

// (Quasar v1.9.9+)
// 如果您只关心比较日期(年/月/日,而不考虑时间),
// 那么您可以向isBetweenDates()提示它,以便它可以获得最佳性能:
if (date.isBetweenDates(dateTarget, dateFrom, dateTo, { onlyDate: true })) {
  // 对dateTarget做点什么
}

要在给定的日期/时间范围内标准化日期,请使用:

import { date } from 'quasar'

let newDate = new Date()
let dateMin = new Date(2010, 2, 23)
let dateMax = new Date(2012, 4, 12)
let dateNormalized = date.getDateBetween(newDate, dateMin, dateMax)
// 如果在2010年2月23日至2012年4月12日之间则返回“newDate”; 如果小于`dateMin`则返回`dateMin`; 如果大于`dateMax`则返回`dateMax`

相等

检查两个日期的单位是否相等使用:

import { date } from 'quasar'

let date1 = new Date(2017, 2, 5)
let date2 = new Date(2017, 3, 8)
let unit = 'year'

if (date.isSameDate(date1, date2, /* 可选 */ unit)) {
  // true, 因为date1和date2的年份是相同的
}

单位参数可以省略,在这种情况下会发生完整的日期/时间比较,否则允许执行部分比较:

单位说明
second测试是否仅有相同的秒
minute测试是否仅有相同的分钟
hour测试是否仅有相同的小时
day测试是否仅有相同的天
month测试是否仅有相同的月份
year测试是否仅有相同的年

差异

要计算两个日期之间的差异,请使用:

import { date } from 'quasar'

let date1 = new Date(2017, 4, 12)
let date2 = new Date(2017, 3, 8)
let unit = 'days'

let diff = date.getDateDiff(date1, date2, unit)
// `diff` 是 34 (天)

单位参数表示测量单位,如果未指定则默认为days

单位说明
second以秒为单位(忽略毫秒)
minute以分钟为单位(忽略秒)
hour以小时为单位(忽略分钟、秒)
day以日历日为单位
month以日历月为单位
year以日历年为单位

日历

要获得给定日期对象是ISO格式的一年的第几周 ,请使用:

import { date } from 'quasar'

let newDate = new Date(2017, 0, 4)
let week = date.getWeekOfYear(newDate) // `week` 是 1

要获得给定日期对象是当年的第几天,请使用:

import { date } from 'quasar'

let newDate = new Date(2017, 1, 4)
let day = date.getDayOfYear(newDate) // `day` 是 35

要获取给定日期对象的星期数,请使用:

import { date } from 'quasar'

let newDate = new Date(2017, 1, 9)
let day = date.getDayOfWeek(newDate) // `day` 是 4

要获取指定日期是当月的第几天:

import { date } from 'quasar'

let newDate = new Date()
let days = date.daysInMonth(newDate) // e.g. 30

开始/结束时间

通过将原始日期对象设置为时间单位的开始来改变原始日期对象:

import { date } from 'quasar'

let newDate = new Date(2000)
// 设定为2000年初(2000年1月1日00:00:00)
newDate = date.startOfDate(newDate, 'year')
// 设定为2000年底 (2000年12月31日, 23:59:59.999)
newDate = date.endOfDate(newDate, 'year')

第二个参数表示要重置为的单位(开始或结束):

单位说明
second重置为秒
minute重置为分钟
hour重置为小时
day重置为天数
month重置为月份
year重置为年

其他

获取格式

import { date } from 'quasar'

date.inferDateFormat(new Date()) // 'date'
date.inferDateFormat(35346363) // 'number'
date.inferDateFormat('Mon Feb 05 2018 23:05:29') // string

克隆日期

import { date } from 'quasar'

const newDate = new Date()
const clonedDate = date.clone(newDate)

date.addToDate(newDate, { days: 1 })

console.log(newDate.getDate() === clonedDate.getDate()) // false

提取日期

通过使用当前Quasar语言包设置的语言环境,允许您根据传递的格式将任何字符串解析为日期对象:

import { date } from 'quasar'

// 示例1
const date = date.extractDate('2019-10-29 --- 23:12', 'YYYY-MM-DD --- HH:mm')
// date 是一个新的 Date() 对象

// 示例 2
const date = date.extractDate('21/03/1985', 'DD/MM/YYYY')
// date 是一个新的 Date() 对象

使用可选的自定义区域设置:

import { date } from 'quasar'

const obj = date.extractDate('Month: Feb, Day: 11th, Year: 2018', '[Month: ]MMM[, Day: ]Do[, Year: ]YYYY', {
  days: ['Duminica', 'Luni', /* 以及所有其余的日子 - 记得从星期天开始*/],
  daysShort: ['Dum', 'Lun', /* 以及所有其余的日子 - 记得从星期天开始 */],
  months: ['Ianuarie', 'Februarie', /* 和所有其余的几个月 */],
  monthsShort: ['Ian', 'Feb', /* 和所有其余的几个月 */]
})
// date 是一个新的 Date() 对象