这个库已经开源,可以用npm install xmcomon直接使用。
https://github.com/zdhsoft/xmcommon 这个库,会不断的补充完善
具体代码如下:
//这里将提供日期相关的工具函数
/**
* 将整数生成字符串,不足2位补0
* 仅在这个模块中使用,不对外使用
* @param {Integer} n 要转换的整数
* @return {String} 转换后的字符串
*/
function pad2(n) {
return n < 10 ? '0' + n.toString(10) : n.toString(10);
}
/**
* 将整数生成字符串,不足3位补0
* 仅在这个模块中使用,不对外使用
* @param {Integer} n 要转换的整数
* @return {String} 转换后的字符串
*/
function pad3(n) {
let r = n.toString(10);
if (n < 10) return '00' + r;
else if (n < 100) return '0' + r;
else return r;
}
/**
* 日期时间的常量
*/
const DatetimeConstant = {
/** 最小的UTC时间 */
MIN_UTC : 1,
/** 最大的UTC时间 */
MAX_UTC : 253370736000000,
/** 无效的UTC时间 */
INVALID_UTC: 0,
/** 每天最大的毫少数 */
MILLIS_PRE_DAY:86400000,
};
let TimeZoneMinute = new Date().getTimezoneOffset(); //时区,单位,分
let TimeZoneSecond = TimeZoneMinute * 60; //时区,单位,秒
let TimeZoneMillis = TimeZoneSecond * 1000; //时区,单位,毫秒数
/**
* 更新时区信息
*/
function UpdateTimeZone() {
TimeZoneMinute = new Date().getTimezoneOffset(); //时区,单位,分
TimeZoneSecond = TimeZoneMinute * 60; //时区,单位,秒
TimeZoneMillis = TimeZoneSecond * 1000; //时区,单位,毫秒数
}
/**
* 日期相关的工具类
*
* @class datetimeUtils
*/
class datetimeUtils {
/**
* 取版本号
* @return {string} 版本字符串
*/
static version() {
return 'datetimeUtils 1.3.0';
}
/**
* 取当前UTC时间戳,毫秒数
* @return {number} 当前UTC时间戳
*/
static getNow() {
return Date.now();
}
/**
* 取当前本地时间戳
* @return {number} 当前本地时间戳
*/
static getLocalNow() {
return Date.now() - TimeZoneMillis;
}
/**
* 取当前UTC时间戳,毫秒数
* @see getNow()
* @return {number} 当前UTC时间戳
*/
static getUTCNow() {
return Date.now();
}
/**
* 取当前UTC时间戳,秒数
* @return {number} 当前UTC时间戳
*/
static getNowSecond() {
return Math.floor(Date.now()/1000);
}
/**
* 取当前UTC时间戳,秒数
* @see getNowSecond()
* @return {number} 当前UTC时间戳
*/
static getUTCNowSecond() {
return Math.floor(Date.now()/1000);
}
/**
* 取当前本地时间戳,秒数
* @return {number} 当前本地时间戳
*/
static getLocalNowSecond() {
return this.getUTCNowSecond() - TimeZoneSecond;
}
/**
* 取时区,单位分
* @return {number} 时区
*/
static getTimeZoneMinute() {
return TimeZoneMinute;
}
/**
* 取时区,单位秒
* @return {number} 时区
*/
static getTimeZoneSecond() {
return TimeZoneSecond;
}
/**
* 取时区,单位毫秒
* @return {number} 时区
*/
static getTimeZoneMillis() {
return TimeZoneMillis;
}
/**
* 更新时区
* @return {void}
*/
static UpdateTimeZoneValue() {
UpdateTimeZone();
}
/**
* 将指定日期的对象,转换为年月日-时分秒的字符串
* 格式为YYYY-MM-DD HH:mm:ss.ddd
*
* @static
* @param {Date} date 要转的日期对象
* @param {boolean} [millsFlag=true] 是否带毫秒数
* @param {String} [daysplit='-'] 日期分隔符
* @param {String} [timesplit=':'] 时间分隔符
* @param {String} [millissplit='.'] 毫秒分隔符
* @param {String} [datetimesplit=' '] 日期和时间的分隔符
* @return {String} 转换后的字符串
*
* @memberOf datetimeUtils
*/
static dateString(date, millsFlag = true, daysplit = '-', timesplit = ':', millissplit = '.', datetimesplit = ' ') {
let d = date;
let dateString = [d.getFullYear(), pad2(d.getMonth() + 1), pad2(d.getDate())].join(daysplit);
let timeString = [pad2(d.getHours()), pad2(d.getMinutes()), pad2(d.getSeconds())].join(timesplit);
if (millsFlag) {
return [dateString, datetimesplit, timeString, millissplit, pad3(d.getMilliseconds())].join('');
}
else {
return [dateString, datetimesplit, timeString].join('');
}
}
/**
* 生成YYYYMMDD_HHmmssddd格式的时间字符串
*
* @static
* @param {Date} date 要生成日期
* @param {boolean} [millisFlag=true] 是要否要毫秒
* @return {String} 生成的字符串
*
* @memberof datetimeUtils
*/
static dateStringByFile(date, millisFlag = true) {
let d = date;
let dateString = [d.getFullYear(), pad2(d.getMonth()+1), pad2(d.getDate()),'_',
pad2(d.getHours()), pad2(d.getMinutes()), pad2(d.getSeconds()), millisFlag ? pad3(d.getMilliseconds()):''
].join('');
return dateString;
}
/**
* 将当前时间,转换为时间字符串
*
* @static
* @param {boolean} millsFlag true 是否带毫秒数
* @returns
*
* @memberOf datetimeUtils
*/
static nowDateString(millsFlag = true) {
return this.dateString(new Date(), millsFlag);
}
/**
* 判断是否是有效的时间戳
* @param {Number} paramUTC
* @return {boolean} 判断结果
* - true 表示有效
* - false 表示无效
*/
static isValidUTC(paramUTC) {
if(Number.isSafeInteger(paramUTC) && paramUTC >= DatetimeConstant.MIN_UTC && paramUTC <= DatetimeConstant.MAX_UTC) {
return true;
}
else {
return false;
}
}
/**
* 将指定日期的时间戳,转换为年月日-时分秒的字符串
* 格式为YYYY-MM-DD HH:mm:ss.ddd
*
* @static
* @param {Number} paramUTC 要转的日期对象
* @param {boolean} [millsFlag=true] 是否带毫秒数
* @param {String} [daysplit='-'] 日期分隔符
* @param {String} [timesplit=':'] 时间分隔符
* @param {String} [millissplit='.'] 毫秒分隔符
* @param {String} [datetimesplit=' '] 日期和时间的分隔符
* @return {String} 转换后的字符串, 如果是无效时间戳,则返回null
*
* @memberOf datetimeUtils
*/
static dateStringByUTC(paramUTC, millisFlag = true, daysplit = '-', timesplit = ':', millissplit = '.', datetimesplit = ' ') {
if(!this.isValidUTC(paramUTC)) {
return null;
}
return this.dateString(new Date(paramUTC), millisFlag, daysplit, timesplit, millissplit, datetimesplit);
}
/**
* 将指定日期的时间,转换为年月日-时分秒的字符串
* 格式为YYYY-MM-DD HH:mm:ss.ddd
*
* @static
* @param {Number} paramLocalTime 要转的日期对象
* @param {boolean} [millsFlag=true] 是否带毫秒数
* @param {String} [daysplit='-'] 日期分隔符
* @param {String} [timesplit=':'] 时间分隔符
* @param {String} [millissplit='.'] 毫秒分隔符
* @param {String} [datetimesplit=' '] 日期和时间的分隔符
* @return {String} 转换后的字符串, 如果是无效时间戳,则返回null
*
* @memberOf datetimeUtils
*/
static dateStringByMillis(paramLocalTime, millisFlag = true, daysplit = '-', timesplit = ':', millissplit = '.', datetimesplit = ' ') {
return this.dateStringByUTC(this.ToUTCTime(paramLocalTime), millisFlag, daysplit, timesplit, millissplit, datetimesplit);
}
/**
* 将yyyy-mm-dd hh:mm:ss的时间日期字符串,转换为utc时间戳,单位毫秒数
* @param {string} paramDateTimeString 要解析的时间字符串
* @return {number} 返回结果, 0 表示失败,无效时间
*/
static DateTimeStringToUTC(paramDateTimeString) {
let d = new Date(paramDateTimeString);
let r = d.getTime();
if(!this.isValidUTC(r)) {
return DatetimeConstant.INVALID_UTC;
}
else {
return r;
}
}
/**
* 将UTC时间转换为本地时间
* @param {Number} paramUTC
* @return {Number}
*/
static ToLocalTime(paramUTC) {
return paramUTC - TimeZoneMillis;
}
/**
* 将本地时间转换为UTC时间
* @param {Number} paramLocalTime
* @return {Number}
*/
static ToUTCTime(paramLocalTime) {
return paramLocalTime + TimeZoneMillis;
}
/**
* 取当天0点时间的UTC时间
* @param {Number} paramUTC 当前的UTC时间,单位毫秒
* @return {Number}
*/
static getTodayZeroTime(paramUTC) {
let localTime = this.ToLocalTime(paramUTC);
return this.ToUTCTime(localTime - localTime % DatetimeConstant.MILLIS_PRE_DAY);
}
/**
* 判断是不是同一天
* @param {Number} paramUTC1
* @param {Number} paramUTC2
* @return {boolean}
*/
static isSameDay(paramUTC1, paramUTC2) {
let t1 = this.getTodayZeroTime(paramUTC1);
let t2 = this.getTodayZeroTime(paramUTC2);
return t1 === t2;
}
/**
* 取本地时间相关的天数
* @param {number} paramUTC1 毫秒数
* @param {number} paramUTC2 毫秒数
* @return {number} 相关的开数,同一天,返回0
*/
static diffLocalDays(paramUTC1, paramUTC2) {
let t1 = this.CalcLocalDaysByUTC(paramUTC1);
let t2 = this.CalcLocalDaysByUTC(paramUTC2);
return t1 - t2;
}
/**
* 计算,元年到指定时间戳的本地天数
* @param {number} paramUTC
* @return {number} 计算出来的本地天数
*/
static CalcLocalDaysByUTC(paramUTC) {
let localTime = this.ToLocalTime(paramUTC);
return (localTime - localTime % DatetimeConstant.MILLIS_PRE_DAY) / DatetimeConstant.MILLIS_PRE_DAY;
}
/**
* 计算,元年到指定时间的本地天数
* @param {Date} paramDate 指定的日期
* @return {number} 计算出来的本地天数
*/
static CalcLocalDaysByDate(paramDate) {
return this.CalcLocalDaysByUTC(paramDate.getTime());
}
}
exports = module.exports = {
datetimeUtils,
DatetimeConstant,
};
//exports.datetimeUtils = datetimeUtils;
测试例子:
let {datetimeUtils}= require("../lib/datetimeUtils");
let {utils} = require("../lib/utils");
let u1 = datetimeUtils.getUTCNow();
let l1 = datetimeUtils.getLocalNow();
let u2 = datetimeUtils.getUTCNowSecond();
let l2 = datetimeUtils.getLocalNowSecond();
let u3 = u1 + 86400000 * 5;
let d1 = new Date();
let d2 = new Date("2019-2-13 0:0:0");
console.log(datetimeUtils.getTimeZoneMinute(), datetimeUtils.getTimeZoneSecond(), datetimeUtils.getTimeZoneMillis());
console.log(u1, l1, l1 - u1);
console.log(u2, l2, l2 - u2);
console.log(datetimeUtils.diffLocalDays(u3,u1));
console.log(datetimeUtils.diffLocalDays(d2.getTime(),d1.getTime()));