由于1900和1904都早于历元
(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历),所以需要使用
GregorianCalendar来计算.
其实使用joda计算最方便,但是不能为了这两个计算就引入几百K的jar包.所以自己动手,查了些资料,自己写了出来.
/**
* 1900日期系统:电子表格将1900年1月1日保存为序列号2,1900年1月2日保存为序列号3, 1900年1月3日保存为序列号4 ……
* 依此类推。<br>
* 注意,此计算在秒及其以下单位有误差
*
* @param days
* @return
*/
public static Date getDateFrom1900(double days) {
GregorianCalendar gc = new GregorianCalendar(1900, 0, 1, 0, 0, 0);
int day = (int) days;// 小数点前
gc.add(Calendar.DAY_OF_MONTH, day - 2);
double digit = days - day;// 小数点后
if (digit > 0) {
int ms = (int) (digit * 24 * 60 * 60 * 1000);
gc.add(Calendar.MILLISECOND, ms);
}
return gc.getTime();
}
/**
* 1904日期系统:电子表格将1904年1月1日保存为序列号0,将1904年1月2 日保存为序列号1,将 1904年1月3日保存为序列号 2 ……
* 依此类推。
*
* @param days
* @return
*/
public static Date getDateFrom1904(double days) {
GregorianCalendar gc = new GregorianCalendar(1904, 0, 1, 0, 0, 0);
int day = (int) days;// 小数点前
gc.add(Calendar.DAY_OF_MONTH, day);
double digit = days - day;// 小数点后
if (digit > 0) {
int ms = (int) (digit * 24 * 60 * 60 * 1000);
gc.add(Calendar.MILLISECOND, ms);
}
return gc.getTime();
}
public static double dateTo1900(Date date) {
if (date == null) {
throw new NullPointerException();
}
GregorianCalendar d1900 = new GregorianCalendar(1900, 0, 1, 0, 0, 0);
GregorianCalendar dcurr = new GregorianCalendar();
dcurr.setTime(date);
int days = getDaysBetween2Calendar(d1900, dcurr);
int hours = dcurr.get(GregorianCalendar.HOUR_OF_DAY);
int mins = dcurr.get(GregorianCalendar.MINUTE);
int s = dcurr.get(GregorianCalendar.SECOND);
int ms = dcurr.get(GregorianCalendar.MILLISECOND);
double d = 2 + days + (((hours * 60 + mins) * 60 + s) * 1000 + ms)
/ (24D * 60 * 60 * 1000) - 1;
return d;
}
public static double dateTo1904(Date date) {
if (date == null) {
throw new NullPointerException();
}
GregorianCalendar d1904 = new GregorianCalendar(1904, 0, 1, 0, 0, 0);
GregorianCalendar dcurr = new GregorianCalendar();
dcurr.setTime(date);
int days = getDaysBetween2Calendar(d1904, dcurr);
int hours = dcurr.get(GregorianCalendar.HOUR_OF_DAY);
int mins = dcurr.get(GregorianCalendar.MINUTE);
int s = dcurr.get(GregorianCalendar.SECOND);
int ms = dcurr.get(GregorianCalendar.MILLISECOND);
double d = days + (((hours * 60 + mins) * 60 + s) * 1000 + ms)
/ (24D * 60 * 60 * 1000) - 1;
return d;
}
private static int getDaysBetween2Calendar(GregorianCalendar gc1,
GregorianCalendar gc2) {
GregorianCalendar gc1Copy = (GregorianCalendar) gc1.clone();
GregorianCalendar gc2Copy = (GregorianCalendar) gc2.clone();
if (gc1Copy.after(gc2Copy)) {
GregorianCalendar temp = gc1Copy;
gc1Copy = gc2Copy;
gc2Copy = temp;
}
gc1Copy.clear(GregorianCalendar.MILLISECOND);
gc1Copy.clear(GregorianCalendar.SECOND);
gc1Copy.clear(GregorianCalendar.MINUTE);
gc1Copy.clear(GregorianCalendar.HOUR_OF_DAY);
gc2Copy.clear(GregorianCalendar.MILLISECOND);
gc2Copy.clear(GregorianCalendar.SECOND);
gc2Copy.clear(GregorianCalendar.MINUTE);
gc2Copy.clear(GregorianCalendar.HOUR_OF_DAY);
int days = 0;
while (gc1Copy.before(gc2Copy)) {
gc1Copy.add(GregorianCalendar.DAY_OF_MONTH, 1);
days++;
}
return days;
}
测试
// 1900 40448.6530580556 2010/9/27 15:40
// 1904 38986.6523888079 2010/9/27 15:39
System.out.println(getDaysBetween2Calendar(new GregorianCalendar(2010,
10, 1), new GregorianCalendar(2010, 10, 2)));
System.out.println(getDateFrom1904(38986.6523888079));
System.out.println(getDateFrom1900(40448.6530580556));
System.out.println(dateTo1900(getDateFrom1900(40448.6530580556)));
System.out.println(dateTo1904(getDateFrom1904(38986.6523888079)));
结果:
1
Mon Sep 27 15:39:26 GMT 2010
Mon Sep 27 15:40:24 GMT 2010
40448.653058055555
38986.652388807874
分享到:
相关推荐
在IT行业中,处理数据时Excel表格常常被用作数据存储和交换的标准格式。"Excel表格读取工具"是一个专门设计用于解析Excel文件并将其数据转换为JSON字符串的实用程序。这个工具简化了从Excel文件中提取信息的过程,...
理解以上概念后,你可以在实际项目中灵活运用这些方法,无论是处理Excel电子表格中的日期数据,还是在编程环境中进行复杂的时间转换。在处理`J_Ryo_CO.csv`和`年转换.txt`时,应首先了解其内容和格式,然后根据需求...
【标题】:“(word完整版)excel表格计算公式大全.doc” 涉及的主要知识点是Excel电子表格软件中的计算公式和功能。Excel是一款强大的数据处理工具,广泛应用于财务、统计、数据分析等领域。文档可能涵盖了从基础到...
总的来说,`ObjectExcelView` 类通过Apache POI库实现了Java将数据导出为Excel的功能,它提供了构建Excel表格的基本结构和样式,以及从模型中获取数据并填充到表格的能力。在实际应用中,你可以根据需要添加更多的...
综上所述,"EXCEL_TO_ORACLE自动创建表"是一个便捷的数据迁移方案,通过PL/SQL Developer工具的ODBC导入器,我们可以轻松地将Excel数据转化为Oracle数据库中的结构化表,大大简化了数据管理的工作流程。
Excel作为一种常用的电子表格工具,可以有效地帮助我们处理和组织数据。本文将详细讲解如何在Excel文件中批量生成INSERT语句,以便快速地将数据导入到数据库中。 首先,我们需要了解INSERT语句的基本结构。INSERT...
Excel 是 Microsoft Office 中的电子表格软件,具有强大的数据处理和分析功能。Excel 中提供了多种函数,可以帮助用户快速处理和分析数据。下面将介绍 Excel 中的一些常用函数。 字符串函数 1. MID 函数:提取字符...
在Excel表格中,掌握一些特殊的技法能够极大地提升数据处理和分析的效率,使得日常工作更加得心应手。以下是一些重要的Excel表格特殊技法的详细解释: 1. **数据验证**:通过设置数据验证规则,可以限制单元格内...
将CMT导出文件转换为.csv文件,以导入到电子表格中 此脚本需要contentManagement导出文件才能处理成列出所有标准报告模板的.csv文件。 在QRadar设备上运行以下命令 /opt/qradar/bin/contentManagement.pl-动作导出...
将这些类型转换成Excel表格,可以更清晰地展示字段的数据特性,方便进行数据分析或者数据验证。 4. **Pdm2CsvTool**:从提供的文件列表来看,"Pdm2CsvTool"可能是实现转换功能的源代码项目。一个常见的做法是利用...
在给定的标签"MODIS"和"DATE"中,"MODIS"是 Moderate Resolution Imaging Spectroradiometer(中分辨率成像光谱仪)的缩写,这是一个广泛用于地球观测的遥感系统,通常产生大量的时间和空间数据。"DATE"则直接指代...
3. **过滤与搜索**:Datatable内置了高效的搜索和过滤功能,用户可以通过输入关键词来快速筛选表格中的数据,同时也可以对单个列进行过滤。 4. **分页**:Datatable支持分页显示,可以根据需要设置每页显示的记录数...
Excel函数是Excel电子表格软件中的强大工具,它们允许用户执行各种复杂的计算、数据分析和数据处理任务。本资源提供了一系列的Excel函数供用户免费下载学习,旨在帮助用户提升在电子表格处理上的技能。 Excel函数...
1. 工作簿与工作表:Excel的工作簿相当于一个电子表格文件,可以包含多个工作表,每个工作表由许多行和列组成,形成单元格,这是存储数据的基本单位。 2. 数据输入:学会正确输入文本、数字、日期和时间等各类数据...
Excel是一款强大的电子表格软件,广泛应用于数据管理、分析和可视化。其令人叫绝的函数功能是其核心竞争力之一。在本篇文章中,我们将深入探讨Excel的若干关键函数及其应用场景,帮助用户更好地掌握这款工具,提升...
《Excel2002函数与公式宝典》是一本旨在帮助用户精通Excel2002中函数和公式的教程。...书中可能包含丰富的实例和练习,帮助读者将理论知识转化为实际操作技能,从而真正提升在Excel中的专业水平,成为真正的Excel高手。
Excel函数是电子表格软件中的强大工具,能够帮助用户快速、准确地处理大量数据。而VBA(Visual Basic for Applications)则是Excel中的编程语言,允许用户自定义功能,创建复杂的自动化流程。 一、Excel函数详解 1...
Excel函数是电子表格软件中用于执行各种计算、数据分析和数据处理的强大工具。这些函数分为多个类别,包括数据库和清单管理、日期和时间、工程以及外部函数等。下面我们将详细介绍这些函数的主要功能和用途。 1. **...
总之,这份"二级Excel试题"全面覆盖了Excel的主要功能,无论是基础操作还是进阶技巧,都能帮助学习者系统提升Excel技能。通过反复练习,不仅能在考试中取得好成绩,更能将这些知识转化为实际工作中的强大工具。