Excel的日期格式约定与解析

原理

当Excel单元格内容为=NOW()时,会显示当前的日期/时间,而倘若你将设置为单元格格式改为非日期时间的格式时,会显示一个非负实数。

Excel 支持两个日期系统:1900年日期系统(推荐)和 1904年日期系统。每个日期系统使用日期作为计算的所有其他工作簿中的唯一开始日期。所有版本的 Excel for Windows 都计算基于 1900年日期系统中的日期。Excel 2008 for Mac 和早期 Excel for Mac 版本计算基于 1904年日期系统的日期。Excel 2016 for Mac 和 Excel for Mac 2011 使用 1900年日期系统,保证日期与 Excel for Windows 的兼容性。

就目前而言,正常情况下这个非负实数的整数位表示该日期距离1900年1月1日的天数,小数位表示该日期的当天时间占据整天时间的比例,因此可以很方便的用代码将其解析成我们的日常使用日期系统。

JAVA实现

// excelDateAnalysis.javapackage ms.excelDateAnalysis;import java.util.Calendar;
import java.util.GregorianCalendar;public class excelDateAnalysis {private static final int SECONDS_PER_MINUTE = 60;private static final int MINUTES_PER_HOUR = 60;private static final int HOURS_PER_DAY = 24;private static final int SECONDS_PER_DAY = (HOURS_PER_DAY    *MINUTES_PER_HOUR *SECONDS_PER_MINUTE);private boolean onlyTime = false;private double excelDate;private int sumDay, sumSecond;private int year, month, day, week;private int hour, minute, second;public boolean onlyTime() { return this.onlyTime;  }public int getSumDay   () { return this.sumDay;    }public int getSumSecond() { return this.sumSecond; }public int getYear     () { return this.year;      }public int getMonth    () { return this.month;     }public int getDay      () { return this.day;       }public int getWeek     () { return this.week;      }public int getHour     () { return this.hour;      }public int getMinute   () { return this.minute;    }public int getSecond   () { return this.second;    }public void test() {excelDateAnalysis eDate = new excelDateAnalysis(this.excelDate);System.out.println("sum second in one day: " + eDate.getSumSecond());System.out.println("sum days: "+eDate.getSumDay());if (!eDate.onlyTime) {System.out.println("Date: " + eDate.getYear()  +"/" + eDate.getMonth() +"/" + eDate.getDay());}System.out.println("Time: " + eDate.getHour()   +":" + eDate.getMinute() +":" + eDate.getSecond());                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          }public excelDateAnalysis(double excelDate) {this.excelDate = excelDate;this.sumDay    = (int)Math.floor(excelDate);this.sumSecond = (int)Math.floor((excelDate-(double)this.sumDay)*SECONDS_PER_DAY+0.5);sumSecondAnalysis(this.sumSecond);sumDayAnalysis(this.sumDay);}private void sumDayAnalysis(int wholeDays) {if (wholeDays==0) {this.onlyTime = true;return;}Calendar calendar = new GregorianCalendar();boolean use1904windowing = false;int startYear = 1900;int dayAdjust = -1; // Excel thinks 2/29/1900 is a valid date, which it isn'tif (use1904windowing) {startYear = 1904;dayAdjust = 1; // 1904 date windowing uses 1/2/1904 as the first day} else if (wholeDays < 61) {// Date is prior to 3/1/1900, so adjust because Excel thinks 2/29/1900 exists // If Excel date == 2/29/1900, will become 3/1/1900 in Java representationdayAdjust = 0;}calendar.set(startYear,0, wholeDays + dayAdjust, 0, 0, 0);calendar.set(GregorianCalendar.MILLISECOND, this.sumSecond*1000);this.year  = calendar.get(Calendar.YEAR);this.month = calendar.get(Calendar.MONTH)+1;this.day   = calendar.get(Calendar.DAY_OF_MONTH);this.week  = calendar.get(Calendar.DAY_OF_WEEK)-1;}private void sumSecondAnalysis(int sumSecond) {this.hour   = sumSecond / SECONDS_PER_MINUTE / MINUTES_PER_HOUR;this.minute = sumSecond / SECONDS_PER_MINUTE - this.hour * MINUTES_PER_HOUR;this.second = sumSecond % SECONDS_PER_MINUTE;}
}

使用起来也很简单:

// Main.javaimport ms.excelDateAnalysis.*;public class Main {public static void main(String[] args) {excelDateAnalysis eDate = new excelDateAnalysis(43529.50258);eDate.test(); // 测试输出}
}

二级办公AOA中的应用

E练习3-03(员工信息表).xlsx 操作要求(2)在Sheet4中,使用函数,将B1中的时间四舍五入到最接近的15分钟的倍数,结果存放在C1单元格中。
Sheet4.B1 <- {自定义}[13:49:38]

利用Excel内建日期函数和四舍五入函数是能解决这道题目的(=TIME(HOUR(B1),15*ROUND(MINUTE(B1)/15,0),SECOND(0))或者=TIME(HOUR(B1),MROUND(MINUTE(B1),"15"),SECOND(0))),但问题是太过繁琐,不够直接,我们用本文提到的原理来解决。

60*24 = 1440

步骤 公式 解释
1 B1*1440 将总分钟数假定为总天数
2 Round(B1*1440/15,0)*15 让总天数变成15分钟的倍数
3 Round(B1*1440/15,0)*15/1440 将变成更改后的总天数变回默认时间约定

Sheet4.C1 <- {自定义}[=Round(B1*1440/15,0)*15/1440]

13:49:38 === 0.576134259

娱乐时间

    excelDateAnalysis eDatePI = new excelDateAnalysis(Math.PI);eDatePI.test();excelDateAnalysis eDateE = new excelDateAnalysis(Math.E);eDateE.test();
sum second in one day: 12234
sum days: 3
Date: 1900/1/3
Time: 3:23:54
sum second in one day: 62060
sum days: 2
Date: 1900/1/2
Time: 17:14:20

转载于:https://www.cnblogs.com/unixart/p/10475960.html

Excel的日期格式约定与解析相关推荐

  1. vue 使用js XLSX读取 excel 转换日期格式

    前言 大家好! 今天遇到了vue 使用js XLSX读取 excel 转换日期格式的问题,做个记录 问题 今天写excel文件上传时,遇到了时间格式没有正确转换的问题 解决方式 借用了 项目中读取 e ...

  2. excel更改日期格式无效_Excel日期不会更改格式

    excel更改日期格式无效 Have you ever imported data into Excel, from your credit card statement, or somewhere ...

  3. 关于excel导出日期格式变化问题处理

    关于excel导出日期格式变化问题处理 1.问题描述:java web项目,本来部署在windows下,导出数据库数据是,创建日期格式为2018-08-08 08:08:08.因服务器性能问题,迁移服 ...

  4. JS读取Excel时日期格式错误

    问题:在做项目的过程中遇到一个问题,导入excel数据时,发现日期的格式错误.预期效果是2022/1/2,导入后的效果却是44563.查阅资料后发现44563表示 1900年1月1号到2022年1月2 ...

  5. 电脑表格日期怎么修改原有日期_“电脑表格日期格式怎么改“如何把excel中日期格式设置为2001-01-01...

    如何在EXCEL中改变日期格式 1.打开需置日期格式的excel表. 2.选中日期所在的格,单击鼠键,选择"设置单元格格式"选项. 3.在弹对话框"数字"标签中 ...

  6. POI对Excel自定义日期格式的读取

    用POI读取Excel数据:(版本号:POI3.7) 1.读取Excel Java代码   private List<String[]> rosolveFile(InputStream i ...

  7. js完美地处理转换 Excel 的日期格式

    问题提出 在使用 js 做 Excel 文件读取时,我们发现对于日期的处理很棘手.主要存在以下几种情况: 所有的日期单元格读取到的是一个类似 44211.7533 的数字的问题 格式不规范问题,如 2 ...

  8. Excel文本日期格式转为日期格式的方法

    存在问题: Excel中单元格日期是"20220301"的文本形式,想对此单元格进行日期加减递推时,必须先转换为日期格式. 解决方案: 选中数据所在列,菜单栏依次:数据 分列→默认 ...

  9. QT读取EXCEL表格日期格式问题解决

    QT读取EXCEL表格日期时间格式问题解决 问题: Qaxobject类操作excel表格,读取代码中日期格式读取错误,变为数字 eg:2016/7/23 输出打印值为 42574.524513888 ...

最新文章

  1. computer vision(计算机视觉)方面的期刊会议,学术必备
  2. 2021年1月10日停电感慨
  3. HttpClient、OKhttp、RestTemplate对比
  4. asp.net mvc使用的心得和问题的解决方法(陆续更新ing)
  5. 麻省理工、微软为AI量身打造了一套leetcode编程题
  6. 最简单快捷搭建私链步骤笔记
  7. Bailian4044 小白鼠再排队【排序】
  8. Vs code 通用插件
  9. java中parser_JavaParser:Java代码生成
  10. textview 属性大全
  11. python模拟登陆qq空间
  12. 电脑版微信每天自动发送
  13. 【苹果手机登录163邮箱】
  14. GIS系列专题(3):缓冲区算法对比研究(Buffer Algorithm),类似刀具补偿
  15. 2019中国大学排名
  16. PyG框架:Graph Classification
  17. 《我的眼睛--图灵识别》第四章:基础:图片识别
  18. 删除的微信好友可以恢复吗?不小心把微信好友删了怎么找回
  19. Parallels Desktop 16 Mac版怎么样?Parallels Desktop 16 For Mac评估
  20. 零基础的人怎么备考二建

热门文章

  1. windows 10 快速修复
  2. bootstrap 全局 CSS 样式
  3. File not found 错误 nginx
  4. c++中的输入输出方法
  5. SpringCloud eureka服务状态监听
  6. bootstrap select 插件两级联动
  7. 2463: [中山市选2009]谁能赢呢? Codeforces Round #429 (Div. 2) B. Godsend noip三国游戏...
  8. Shuttle ESB实现消息推送
  9. Java魔法堂:枚举类型详解
  10. python学习笔记十五:日期时间处理笔记