多语言实现OADate日期格式跟常规日期格式互转
前言
相信有用过日期格式并进行过json数据导出的小伙伴应该不难发现,当单元格的值是一个日期时,我们导出的日期数据会被储存为OADate。
通常情况下我们使用OADate是为了解决日期序列化以及时区问题,所以我们使用这种特殊的方式保存日期。但是很多情况下我们需要对日期数据进行一些处理,但是无奈的是不知如何进行转换。
今天——它来了,它来了,小编着教程走来啦。
一、JavaScript方式实现
1.1 JavaScript实现常规日期格式转OADate日期格式
function dateToOADate(date) {
const ticks = new Date(date).valueOf() - new Date().getTimezoneOffset() * 60 * 1000;
const oad = ticks / 86400000 + 25569;
if (oad < 0) {
const frac = oad - Math.trunc(oad);
if (frac !== 0) {
oad = Math.ceil(oad) - frac - 2;
}
}
return oad;
}
// 当前系统时间,注意⚠️:小数点数字类似于时间戳,会变化的哦
console.log(dateToOADate(new Date())); // 45033.66837747685
// 常规格式时间
console.log(dateToOADate('2023-04-17 12:35:35')); // 45033.52471064815
1.2 JavaScript实现OADate日期格式转常规日期格式
function OADateToDate(oadate){
const ms = (oadate * 86400000 * 1440 - 25569 * 86400000 * 1440 + new Date((oadate - 25569) * 86400000).getTimezoneOffset() * 86400000 ) / 1440;
return new Date(ms);
}
console.log(OADateToDate(45033.52471064815)); //Mon Apr 17 2023 12:35:35 GMT+0800 (中国标准时间)
1.3 JavaScript实现日期可指定格式的格式化函数
function formatDateTime(date, format) {
const o = {
'M+': date.getMonth() + 1, // 月份
'd+': date.getDate(), // 日
'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 小时
'H+': date.getHours(), // 小时
'm+': date.getMinutes(), // 分
's+': date.getSeconds(), // 秒
'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
S: date.getMilliseconds(), // 毫秒
a: date.getHours() < 12 ? '上午' : '下午', // 上午/下午
A: date.getHours() < 12 ? 'AM' : 'PM', // AM/PM
};
if (/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
}
for (let k in o) {
if (new RegExp('(' + k + ')').test(format)) {
format = format.replace(
RegExp.$1,
RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
);
}
}
return format;
}
console.log(formatDateTime(new Date(), 'yyyy-MM-dd HH:mm:ss')); // 2023-04-17 17:49:05
console.log(formatDateTime(new Date(), 'yyyy-MM-dd hh:mm:ss A')); // 2023-04-17 17:49:05 PM
console.log(formatDateTime(new Date(), 'yyyy-MM-dd hh:mm:ss a')); // 2023-04-17 17:49:05 下午
二、Python方式实现
2.1 Python实现常规日期格式转OADate日期格式
import time
import math
def date_to_oadate(format_date=None):
if format_date is None:
current_milli_time = int(time.time()*1000)
else:
time_array = time.strptime(format_date, "%Y-%m-%d %H:%M:%S")
current_milli_time = int(time.mktime(time_array)) * 1000
ticks = current_milli_time - (int(-time.timezone / 60) * 60 * 1000)
oad = ticks / 86400000 + 25569
if oad < 0:
frac = oad - math.trunc(oad)
if frac != 0:
oad = math.ceil(oad) - frac - 2
return oad
if __name__ == '__main__':
print(date_to_oadate()) # 45033.02221047453
print(date_to_oadate("2023-04-17 12:35:35")) # 45032.85804398148
2.2 Python实现OADate日期格式转常规日期格式
from datetime import datetime
import pytz.reference
def oadate_to_date(oadate):
tre_timeArray = datetime.fromtimestamp((oadate - 25569) * 86400)
local_tnz = pytz.reference.LocalTimezone()
ss = int(local_tnz.utcoffset(tre_timeArray).total_seconds() / 60)
res = (oadate * 86400000 * 1440 - 25569 * 86400000 * 1440 + ss * 86400000) / 1440
return datetime.fromtimestamp(int(res/1000))
if __name__ == '__main__':
print(oadate_to_date(45032.85804398148)) # 2023-04-17 12:35:35
三、Java方式实现
3.1 Javat实现常规日期格式转OADate日期格式
public static Double convertToOADate(Date date) throws ParseException {
double oaDate;
SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy");
Date baseDate = myFormat.parse("30 12 1899");
long days = TimeUnit.DAYS.convert(date.getTime() - baseDate.getTime(), TimeUnit.MILLISECONDS);
oaDate = (double) days + ((double) date.getHours() / 24) + ((double) date.getMinutes() / (60 * 24)) + ((double) date.getSeconds() / (60 * 24 * 60));
return oaDate;
}
3.2 Java实现OADate日期格式转常规日期格式
public static Date convertFromOADate(double d) throws ParseException {
double mantissa = d - (long) d;
double hour = mantissa*24;
double min =(hour - (long)hour) * 60;
double sec=(min- (long)min) * 60;
SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy");
Date baseDate = myFormat.parse("30 12 1899");
Calendar c = Calendar.getInstance();
c.setTime(baseDate);
c.add(Calendar.DATE,(int)d);
c.add(Calendar.HOUR,(int)hour);
c.add(Calendar.MINUTE,(int)min);
c.add(Calendar.SECOND,(int)sec);
return c.getTime();
}