Обычно при разработке проекта мы часто сталкиваемся с обработкой большого количества времени.Сначала мы выбирали момент.В последствии мы обнаружили, что на самом деле сцены, которые должны обрабатывать функции в проекте, относительно просты, и нет необходимости вводить момент, так что мы начали заниматься датами дороги.
Тур по заполнению карьера
яма один
Сначала посмотрите на приведенный выше код, я намерен сгенерировать время 2018-06-17 00:00:00, но результат операции — 8:00 утра. Тогда причина для уточнения этого связана с концепциями GMT и UTC.
GMT (среднее время по Гринвичу) — это время, официально используемое некоторыми европейскими и африканскими странами, а UTC — это международный стандарт. Эти два времени обычно равны. Китай расположен в Восточном Восьмом округе, который находится в 8 часах от времени UTC, то есть, когда время UTC 00:00:00, наше время 08:00:00.
Чтобы избежать этого явления, для любого ввода единообразно генерируется время UTC, затем создается новая функция даты, которая используется для генерации согласованного времени в соответствии с входящим шаблоном времени. Дата из нового шаблона времени в формате «гггг-мм-дд» — это местное время, поэтому сопоставьте ее с регулярным выражением./^\d{4}(-\d{2}){0,2}$/.test(date)
. Переопределите конструктор Date для создания согласованного времени на основе входного шаблона времени.
var localDate = new Date(date)
if (date && /^\d{4}(-\d{2}){0,2}$/.test(date)) {
let timeZoneOffset = localDate.getTimezoneOffset()
let utcTimeStamp = localDate.getTime() + timeZoneOffset * 60 * 1000
return new Date(utcTimeStamp)
}
яма два
Выполнить на IOSnew Date('1990-01-04 09:09:09')
получит invilaid дату. Метод лечения правильный1990-01-04
Перевести в1990/01/04
формат
Чтобы отличить время от обычных строк, бэкэнд обычно добавляет шаблон времениT
Время разделения, например «1990-01-04T10:10:00».
результаты работы мобильного терминала js
Стандартный формат ISO 8601: ГГГГ-ММ-ДДЧЧ:мм:сс.ссссZ.T
Это означает UTC, поэтому время на мобильном терминале добавит 8-часовую разницу во времени.
также,
С учетом задней частиT
Он просто используется для различения обычных строк и времени, поэтому здесь будетT
Замените пробелами.
Полная функция для генерации даты
function DateUTC (date) {
let isDate = (typeof date === 'object') && (date instanceof Date)
if (isDate) return date
let localDate
if (Object.prototype.toString.apply(date).slice(-7, -1) === 'String') {
date = date.replace(/T/, ' ').replace(/-/g, '/')
}
try {
localDate = date === undefined ? new Date() : new Date(date)
} catch (e) {
console.error(e)
}
var localDate = new Date(date)
if (date && /^\d{4}(-\d{2}){0,2}$/.test(date)) {
let timeZoneOffset = localDate.getTimezoneOffset()
let utcTimeStamp = localDate.getTime() + timeZoneOffset * 60 * 1000
return new Date(utcTimeStamp)
}
return localDate
}
Часто используемые функции
формат, время форматирования
// 默认的格式是 'yyyy-MM-dd'
function format (date, form = 'yyyy-MM-dd') {
date = DateUTC(date)
if (!form) return date
let year = date.getFullYear()
let month = leftPad(date.getMonth() + 1)
let day = leftPad(date.getDate())
let hours = leftPad(date.getHours())
let minutes = leftPad(date.getMinutes())
let seconds = leftPad(date.getSeconds())
return form.replace('yyyy', year).replace('MM', month).replace('dd', day).replace('HH', hours).replace('mm', minutes).replace('ss', seconds)
}
diff, вычисляет разницу между двумя значениями времени
/**
*
* @param {*} time1 a Date object or Date params
* @param {*} time2 a Date object or Date params
* @param {*} unit can be one of ['year', 'month', 'day', 'hour', 'minute', 'second']
* @param {*} exact get exact day diff
*/
function diff (time1, time2, unit='day', exact = false) {
let date1 = DateUTC(time1)
let date2 = DateUTC(time2)
if (unit === 'year') {
return date2.getFullYear() - date1.getFullYear()
}
if (unit === 'month') {
let diffYear = date2.getFullYear() - date1.getFullYear()
return (date2.getMonth() - date1.getMonth()) + 12 * diffYear
}
if (!exact && unit === 'day') {
date1 = DateUTC(format(date1, 'yyyy-MM-dd'))
date2 = DateUTC(format(date2, 'yyyy-MM-dd'))
}
let timeStampUnit = getTimeStampUnit(unit)
return parseInt((date2.getTime() - date1.getTime()) / timeStampUnit)
}
dateFrom, в соответствии с заданным временем time, возвращает другое время
/**
*
* @param {*} date a Date object or Date params
* @param {*} diff
* @param {*} unit can be one of ['year', 'month', 'day', 'hour', 'minute', 'second']
* for example: dateFrom('2012-02-29', 12, 'month') // Fri Mar 01 2013 00:00:00 GMT+0800 (CST)
*/
function dateFrom(time, diff, unit='day') {
let date = DateUTC(time)
if (unit === 'year') {
let year = date.getFullYear() + diff
return DateUTC(date.setFullYear(year))
}
if (unit === 'month') {
let month = date.getMonth() + diff
return DateUTC(date.setMonth(month))
}
let timeStampUnit = getTimeStampUnit(unit)
return DateUTC(date.getTime() + diff * timeStampUnit)
}
dateTemplate, функция шаблона времени
/**
* a date template which can help you new a Date
*/
function dateTemplate ({ date, diff, form, unit } = {}) {
var _date = !date ? DateUTC() : date
if (diff) {
_date = dateFrom(_date, diff, unit)
}
if (form) {
_date = format(_date, form)
}
return _date
}
полный код
(function ($) {
function DateUTC (date) {
if (arguments.length === 0) return new Date()
if (isDate(date)) return date
let localDate
if (Object.prototype.toString.apply(date).slice(-7, -1) === 'String') {
date = date.replace(/T/, ' ').replace(/-/g, '/')
}
try {
localDate = new Date(date)
} catch (e) {
console.error(e)
}
// 匹配yyyy-MM-dd | yyyy-MM
if (date && /^\d{4}(-\d{2}){0,2}$/.test(date)) {
let timeZoneOffset = localDate.getTimezoneOffset()
let utcTimeStamp = localDate.getTime() + timeZoneOffset * 60 * 1000
return new Date(utcTimeStamp)
}
return localDate
}
function format (date, form = 'yyyy-MM-dd') {
date = DateUTC(date)
if (!form) return date
let year = date.getFullYear()
let month = leftPad(date.getMonth() + 1)
let day = leftPad(date.getDate())
let hours = leftPad(date.getHours())
let minutes = leftPad(date.getMinutes())
let seconds = leftPad(date.getSeconds())
return form.replace('yyyy', year).replace('MM', month).replace('dd', day).replace('HH', hours).replace('mm', minutes).replace('ss', seconds)
}
/**
*
* @param {*} time1 a Date object or Date params
* @param {*} time2 a Date object or Date params
* @param {*} unit can be one of ['year', 'month', 'day', 'hour', 'minute', 'second']
* @param {*} exact get exact day diff
*/
function diff (time1, time2, unit='day', exact = false) {
let date1 = DateUTC(time1)
let date2 = DateUTC(time2)
if (unit === 'year') {
return date2.getFullYear() - date1.getFullYear()
}
if (unit === 'month') {
let diffYear = date2.getFullYear() - date1.getFullYear()
return (date2.getMonth() - date1.getMonth()) + 12 * diffYear
}
if (!exact && unit === 'day') {
date1 = DateUTC(format(date1, 'yyyy-MM-dd'))
date2 = DateUTC(format(date2, 'yyyy-MM-dd'))
}
let timeStampUnit = getTimeStampUnit(unit)
return parseInt((date2.getTime() - date1.getTime()) / timeStampUnit)
}
/**
*
* @param {*} date a Date object or Date params
* @param {*} diff
* @param {*} unit can be one of ['year', 'month', 'day', 'hour', 'minute', 'second']
* for example: dateFrom('2012-02-29', 12, 'month') // Fri Mar 01 2013 00:00:00 GMT+0800 (CST)
*/
function dateFrom(time, diff, unit='day') {
let date = DateUTC(time)
if (unit === 'year') {
let year = date.getFullYear() + diff
return DateUTC(date.setFullYear(year))
}
if (unit === 'month') {
let month = date.getMonth() + diff
return DateUTC(date.setMonth(month))
}
let timeStampUnit = getTimeStampUnit(unit)
return DateUTC(date.getTime() + diff * timeStampUnit)
}
/**
* a date template which can help you new a Date
*/
function dateTemplate ({ date, diff, form, unit } = {}) {
var _date = !date ? DateUTC() : date
if (diff) {
_date = dateFrom(_date, diff, unit)
}
if (form) {
_date = format(_date, form)
}
return _date
}
function isDate (date) {
return date instanceof Date
}
function leftPad (val) {
return val.toString().padStart(2, '0')
}
function getTimeStampUnit (unit) {
switch (unit) {
case 'day':
return 1000 * 3600 * 24
case 'hour':
return 1000 * 3600
case 'minute':
return 1000 * 60
case 'second':
return 1000
break
default:
return 1
}
}
$.format = format
$.diff = diff
$.DateUTC = DateUTC
$.dateFrom = dateFrom
$.dateTemplate = dateTemplate
})(window.$);