使用eaysexcel时里面的日期转换问题
使用easyexcel進行excel讀取時,發現對日期的轉換不對,讀取到的日期是一個dubble型的浮點數。比如說43458.234189814815
經查資料,這個浮點數其實就是excel內部存儲時間的形式,也叫時間序列號
規則如下:
Excel將日期和時間存儲為稱為日期序列號或日期時序列號的數字。
當你在Excel中查看日期時,它實際上是一個常規數字,其格式設置為日期。如果將單元格格式更改為“常規”,則會看到基礎日期序列號。
日期序列號的整數部分表示日期,小數部分表示時間。日期從1900年1月1日開始,即1/1/1900的日期序列號為1。
警告!1900年2月28日之后的Excel日期實際上是一天。Excel表現得好像1900年2月29日存在,但事實并非如此。
Microsoft故意在Excel中包含此錯誤,以便它與當時占據大部分市場份額的電子表格程序保持兼容;
但是這個bug,只要您的所有日期都晚于1900年3月1日,這不是問題。
日期
Excel中,這些被稱為“日期序列號”,它們使我們能夠進行數學計算并在公式中使用日期。
Excel日期序列號示例
“日期序列號”列顯示日期序列號等效的“日期”列值。
例如,2017年1月1日有42736.即日期序號 , 2017年1月是42736天自 1899年12月31日。
提示:將日期序列號列格式化為日期,您將看到它們與日期列值相同。
時間
時間也使用序列號格式并表示為小數部分。
小時:由于24小時= 1天,我們可以推斷24小時的時間序列號為1,可以格式化為24:00或12:00 AM或0:00顯示的時間。而12小時或12:00的時間值為0.50,因為它是24小時或半天的一半,而1小時是0.41666’,因為它是一天的1/24。
分鐘:由于1小時是一天的1/24,1分鐘是1/60小時,我們也可以說1分鐘是一天的1/1440,或者它的時間序列號是0.00069444’
秒:因為秒是1/60分鐘,即1/60小時,即一天的1/24。我們還可以說一秒是1/86400的一天或時間序列號形式它是0.0000115740740740741 …
Excel時間序列號示例
日期和時間在一起
現在我們知道如何存儲日期和時間,我們可以把它們放在一起 ddddd.tttttt
例如,2012年1月為10:00:00 am有日期時間的序列值40909.4166666667
40909是代表2012年1 月1 日的序列值,4166666667是10:00 AM和00秒的十進制值。
知道以上規則,我們可以自己手寫一個轉換方法,雖然poi里面也內置了這個方法,但是沒有必要為了轉換一個日期而引入如此龐大的框架。
/*** 解析時間 43458.234189814815 解析秒數的例子*/public static LocalTime getTime(double d) {//全部轉成秒int sec = (int) (d * 86400);//時int s = sec / 3600;//分int h = sec % 3600 / 60;//秒int m = sec % 3600 % 60;String ss = s + "";String hh = h + "";String mm = m + "";if (s < 10) {ss = "0" + ss;}if (h < 10) {hh = "0" + hh;}if (m < 10) {mm = "0" + mm;}LocalTime time = LocalTime.parse(ss + ":" + hh + ":" + mm);return time;}不過推薦使用這個方法 是從poi里面截取出來的
/**
* @param use1904windowing
* @param value
* @return
*/
public String getPOIDate(boolean use1904windowing, double value) {
log.info("getDate: " + value);
int wholeDays = (int) Math.floor(value);
int millisecondsInDay = (int) ((value - (double) wholeDays) * 8.64E7D + 0.5D);
Calendar calendar = new GregorianCalendar();
short startYear = 1900;
byte dayAdjust = -1;
if (use1904windowing) {
startYear = 1904;
dayAdjust = 1;
} else if (wholeDays < 61) {
dayAdjust = 0;
}
calendar.set(startYear, 0, wholeDays + dayAdjust, 0, 0, 0);
calendar.set(Calendar.MILLISECOND, millisecondsInDay);
if (calendar.get(Calendar.MILLISECOND) == 0) {
calendar.clear(Calendar.MILLISECOND);
}
Date date = calendar.getTime();
SimpleDateFormat s = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
return s.format(date);
}
總結
以上是生活随笔為你收集整理的使用eaysexcel时里面的日期转换问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深刻检讨
- 下一篇: 模型涨点的思路,深度学习训练的trick