tian-yan-yan
Version:
一套不算好用的组件
180 lines (135 loc) • 4.91 kB
JavaScript
/*
* 时区
* @author: 张文
* @date 2022-08-03
* */
import {DateTime} from "./DateTime";
import {LocalStorage} from "./LocalStorage";
export const Timezone = {
/**
* 获取时区数据
* @author 张文
* @return {Object} 时区
* */
get(){
return window.tyWindowGlobalData.get('timezone')
},
/**
* 获取指定时区的偏移量
* @author 张文
* @param {String|null} timezone 需要获取的时区
* @return {Number} 时区的偏移值(min)
* */
getTimezoneOffset(timezone = null){
let numOffset = ''
if (timezone){
// 获取时区的值
let timezoneObj = this.get()[timezone] || {}
// 判断是否成功获取到时区
if (!Object.keys(timezoneObj).length) {
console.error('调用【时间转换】方法时,传入的timezone无法获取到时区,已默认为0时区,数据可能存在差异,请注意!')
numOffset = 0
}else {
numOffset = timezoneObj.offset
}
}else {
// 如果没有传入偏移值就取系统选择的时区
numOffset = Number(LocalStorage.get('tyTimezone').offset)
}
return numOffset
},
/**
* 获取当前时区,及偏移量
* @author 张文
* @return {Object} {timezone: 时区, offset: 时区差值(min)}
* */
getTimezone(){
let offset = new Date().getTimezoneOffset()
let timezone = offset / 60
// 判断是否是0时区
if (timezone === 0){
return {
timezone: 'UTC',
offset: 0
}
}
// 判断是否是西时区
if (timezone > 0) {
return {
timezone: 'UTC-' + timezone,
offset: Number('-' + timezone) * 60
}
}
return {
timezone: 'UTC+' + Math.abs(timezone),
offset: Math.abs(timezone) * 60
}
},
/**
* 将时区时间转换为标准时间
* @author 张文
* @param {Object} obj
* date - 需要转换的时间;
* timezone - 转换时间所属的时区 - 为空时默认取用户选择的时区;
* format - 格式化表达式;
* backUTC - 当格式化表达式为空时,是否返回标准时间格式;
* @return {String|Number} 当format为空时返回标准时间格式或时间戳,否则返回格式化后的时间
* */
timezoneToUTC({date, timezone, format, backUTC = true}){
// 标准时间的时间戳
let utc = ''
// 获取当前设备所处时区
const nowTimezone = this.getTimezone()
// 获取设备所处时区的标准时间戳
const s = Date.parse(new Date(date).toUTCString())
let numOffset = this.getTimezoneOffset(timezone)
utc = s + (nowTimezone.offset - numOffset) * 60 * 1000
if (format) {
// DateTime.format方法是通过new Date()实现,所以需要减去当前时间偏移量才是标准时间
return DateTime.format(utc - nowTimezone.offset * 60 * 1000, format)
}
if (backUTC){
const utcList = DateTime.format(utc - nowTimezone.offset * 60 * 1000, 'yyyy-MM-dd hh:mm:ss').split(' ')
return utcList.join('T')+'Z'
}
return utc
},
/**
* 将标准时间转换为时区时间
* @author 张文
* @param {Object} obj date - 需要转换的标准时间;timezone-需要转换的时区 - 为空时默认取用户选择的时区;format - 格式化表达式
* @return {String|Number} 当format为空时返回时间戳,否则返回格式化后的时间
* */
UTCToTimezone({date, timezone, format = 'yyyy-MM-dd hh:mm'}){
// 时区时间戳
let timezoneTime = ''
let d = date
if (/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(.\d+)?Z)/gm.test(date)){
d = date.replace(/[T|Z]/gm,' ')
}
// 获取标准时间的时间戳
const s = Date.parse(d)
let numOffset = this.getTimezoneOffset(timezone)
timezoneTime = s + numOffset * 60 * 1000
if (format) return DateTime.format(timezoneTime, format)
return timezoneTime
},
/**
* 获取指定时区的时间
* @author 张文
* @param {Object} obj timezone - 需要获取时间的时区;format - 格式化表达式
* @return {String|Number} 当format为空时返回时间戳,否则返回格式化后的时间
* */
getTimezoneDate({timezone, format}={}){
// 获取设备所处时区的标准时毫秒数
const s = Date.parse(new Date().toUTCString())
// 获取当前时区
const nowTimezone = this.getTimezone()
// 获取时区的偏移值
let numOffset = this.getTimezoneOffset(timezone)
// 根据当前值和时间偏移值计算出偏移后的标准时毫秒数
const utc = s + (numOffset - nowTimezone.offset) * 60 * 1000
if (format) return DateTime.format(utc, format)
return utc
},
}