多语言实现OADate日期格式跟常规日期格式互转
多语言实现OADate日期格式跟常规日期格式互转
- 前言
- 一、JavaScript方式实现
-
- 1.1 JavaScript实现常规日期格式转OADate日期格式
- 1.2 JavaScript实现OADate日期格式转常规日期格式
- 1.3 JavaScript实现日期可指定格式的[格式化](https://y.js.cn/compress.html)函数
- 二、Python方式实现
-
- 2.1 Python实现常规日期格式转OADate日期格式
- 2.2 Python实现OADate日期格式转常规日期格式
- 三、Java方式实现
-
- 3.1 Javat实现常规日期格式转OADate日期格式
- 3.2 Java实现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 mathdef 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)) * 1000ticks = current_milli_time - (int(-time.timezone / 60) * 60 * 1000)oad = ticks / 86400000 + 25569if oad < 0:frac = oad - math.trunc(oad)if frac != 0:oad = math.ceil(oad) - frac - 2return oadif __name__ == '__main__':print(date_to_oadate()) # 45033.02221047453print(date_to_oadate("2023-04-17 12:35:35")) # 45032.85804398148
2.2 Python实现OADate日期格式转常规日期格式
from datetime import datetime
import pytz.referencedef 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) / 1440return 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();
}