多语言实现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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值