`
i2534
  • 浏览: 182823 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

电子表格中1900,1904系统和date之间的转化

    博客分类:
  • util
 
阅读更多

由于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
 
分享到:
评论

相关推荐

    Excel表格读取工具

    在IT行业中,处理数据时Excel表格常常被用作数据存储和交换的标准格式。"Excel表格读取工具"是一个专门设计用于解析Excel文件并将其数据转换为JSON字符串的实用程序。这个工具简化了从Excel文件中提取信息的过程,...

    decimal date转换_date转decimal_decimal转date_decimal转date_timeconver

    理解以上概念后,你可以在实际项目中灵活运用这些方法,无论是处理Excel电子表格中的日期数据,还是在编程环境中进行复杂的时间转换。在处理`J_Ryo_CO.csv`和`年转换.txt`时,应首先了解其内容和格式,然后根据需求...

    (word完整版)excel表格计算公式大全.doc

    【标题】:“(word完整版)excel表格计算公式大全.doc” 涉及的主要知识点是Excel电子表格软件中的计算公式和功能。Excel是一款强大的数据处理工具,广泛应用于财务、统计、数据分析等领域。文档可能涵盖了从基础到...

    java 导入到EXCEL表格(csdn)————程序.pdf

    总的来说,`ObjectExcelView` 类通过Apache POI库实现了Java将数据导出为Excel的功能,它提供了构建Excel表格的基本结构和样式,以及从模型中获取数据并填充到表格的能力。在实际应用中,你可以根据需要添加更多的...

    EXCEL_TO_ORACLE自动创建表

    综上所述,"EXCEL_TO_ORACLE自动创建表"是一个便捷的数据迁移方案,通过PL/SQL Developer工具的ODBC导入器,我们可以轻松地将Excel数据转化为Oracle数据库中的结构化表,大大简化了数据管理的工作流程。

    excel文件中批量生成insert语句

    Excel作为一种常用的电子表格工具,可以有效地帮助我们处理和组织数据。本文将详细讲解如何在Excel文件中批量生成INSERT语句,以便快速地将数据导入到数据库中。 首先,我们需要了解INSERT语句的基本结构。INSERT...

    计算机二级MS-Office中Excel常用函数.docx

    Excel 是 Microsoft Office 中的电子表格软件,具有强大的数据处理和分析功能。Excel 中提供了多种函数,可以帮助用户快速处理和分析数据。下面将介绍 Excel 中的一些常用函数。 字符串函数 1. MID 函数:提取字符...

    Excel表格特殊技法

    在Excel表格中,掌握一些特殊的技法能够极大地提升数据处理和分析的效率,使得日常工作更加得心应手。以下是一些重要的Excel表格特殊技法的详细解释: 1. **数据验证**:通过设置数据验证规则,可以限制单元格内...

    QRadar-reports2csv:将CMT导出的.tar.gz文件转换为.csv文件,以导入到电子表格中

    将CMT导出文件转换为.csv文件,以导入到电子表格中 此脚本需要contentManagement导出文件才能处理成列出所有标准报告模板的.csv文件。 在QRadar设备上运行以下命令 /opt/qradar/bin/contentManagement.pl-动作导出...

    PowerDesigner(PDM)文件自动转换为Excel文件格式

    将这些类型转换成Excel表格,可以更清晰地展示字段的数据特性,方便进行数据分析或者数据验证。 4. **Pdm2CsvTool**:从提供的文件列表来看,"Pdm2CsvTool"可能是实现转换功能的源代码项目。一个常见的做法是利用...

    序号日期转标准年月日型日期

    在给定的标签"MODIS"和"DATE"中,"MODIS"是 Moderate Resolution Imaging Spectroradiometer(中分辨率成像光谱仪)的缩写,这是一个广泛用于地球观测的遥感系统,通常产生大量的时间和空间数据。"DATE"则直接指代...

    很方便的前端表格工具datatable

    3. **过滤与搜索**:Datatable内置了高效的搜索和过滤功能,用户可以通过输入关键词来快速筛选表格中的数据,同时也可以对单个列进行过滤。 4. **分页**:Datatable支持分页显示,可以根据需要设置每页显示的记录数...

    EXCEL 函数

    Excel函数是Excel电子表格软件中的强大工具,它们允许用户执行各种复杂的计算、数据分析和数据处理任务。本资源提供了一系列的Excel函数供用户免费下载学习,旨在帮助用户提升在电子表格处理上的技能。 Excel函数...

    办公软件EXCEL函数教案

    1. 工作簿与工作表:Excel的工作簿相当于一个电子表格文件,可以包含多个工作表,每个工作表由许多行和列组成,形成单元格,这是存储数据的基本单位。 2. 数据输入:学会正确输入文本、数字、日期和时间等各类数据...

    令人叫绝的EXCEL函数功能

    Excel是一款强大的电子表格软件,广泛应用于数据管理、分析和可视化。其令人叫绝的函数功能是其核心竞争力之一。在本篇文章中,我们将深入探讨Excel的若干关键函数及其应用场景,帮助用户更好地掌握这款工具,提升...

    excel2002函数与公式宝典

    《Excel2002函数与公式宝典》是一本旨在帮助用户精通Excel2002中函数和公式的教程。...书中可能包含丰富的实例和练习,帮助读者将理论知识转化为实际操作技能,从而真正提升在Excel中的专业水平,成为真正的Excel高手。

    excel函数集合及VBA范例+教材-使用

    Excel函数是电子表格软件中的强大工具,能够帮助用户快速、准确地处理大量数据。而VBA(Visual Basic for Applications)则是Excel中的编程语言,允许用户自定义功能,创建复杂的自动化流程。 一、Excel函数详解 1...

    excel函数的说明及其详细的解释.docx

    Excel函数是电子表格软件中用于执行各种计算、数据分析和数据处理的强大工具。这些函数分为多个类别,包括数据库和清单管理、日期和时间、工程以及外部函数等。下面我们将详细介绍这些函数的主要功能和用途。 1. **...

    二级Excel试题

    总之,这份"二级Excel试题"全面覆盖了Excel的主要功能,无论是基础操作还是进阶技巧,都能帮助学习者系统提升Excel技能。通过反复练习,不仅能在考试中取得好成绩,更能将这些知识转化为实际工作中的强大工具。

Global site tag (gtag.js) - Google Analytics