UNPKG

tian-yan-yan

Version:

一套不算好用的组件

180 lines (135 loc) 4.91 kB
/* * 时区 * @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 }, }