找回密码
 立即注册

QQ登录

只需一步,快速开始

Derrick.Jiao 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-12-2 14:48  /   查看:2424  /  回复:0
本帖最后由 Derrick.Jiao 于 2021-12-2 14:57 编辑

相信有用过日期并导出过json的小伙伴应该不难发现,当单元格的值是一个日期时,我们会将其存储为OADate。这是为了解决日期的序列化以及时区问题,所以我们用了这样一个特殊的方式保存日期。有朋友想要拿到这个日期做一些处理,但是无奈不止如何进行转换,今天教程他来了,而且是不同的编程环境下都有对应的解决方案。
首先我们来看前端
  1. function fromOADate(date) {
  2.             var oaDateReg = new RegExp('^/OADate\\(([-+]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)\\)/\\s*

  3. );
  4.             if (typeof date === "string" && oaDateReg.test(date)) {
  5.                 var oadate = parseFloat(date.match(oaDateReg)[1]);
  6.                 var ms = (oadate * 86400000 * 1440 - 25569 * 86400000 * 1440 + new Date((oadate - 25569) * 86400000).getTimezoneOffset() * 86400000 ) / 1440;
  7.                 return new Date(ms);
  8.             }else{
  9.                 return date;
  10.             }
  11.         }
复制代码
image.png290733641.png
另外,还有一个取巧的办法就是通过tag进行一个转换
  1. sheet.tag("/OADate(44542)/");
  2. var date = sheet.tag();
复制代码

image.png303664550.png

接着后端java环境下
  1. long d = 44542;
  2.         double  mantissa = d - (long) d;
  3.         double hour = mantissa*24;
  4.         double min =(hour - (long)hour) * 60;
  5.         double sec=(min- (long)min) * 60;


  6.         SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy");
  7.         Date baseDate = myFormat.parse("30 12 1899");
  8.         Calendar c = Calendar.getInstance();
  9.         c.setTime(baseDate);
  10.         c.add(Calendar.DATE,(int)d);
  11.         c.add(Calendar.HOUR,(int)hour);
  12.         c.add(Calendar.MINUTE,(int)min);
  13.         c.add(Calendar.SECOND,(int)sec);

  14.         System.out.println(c.getTime());
复制代码


image.png634067382.png

最后是.net环境只需一句代码就能搞定
  1. System.DateTime.FromOADate(44542)
复制代码


image.png490709533.png

怎样,学“废”了吗?
image.png48309325.png

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部