在JavaScript中将日期(dd/mm/yyyy)转换为Excel序列号
说明: 我在角度项目上使用XLSX(npm安装XLSX)生成Excel文件,但我在显示精确日期时遇到问题。如果我尝试使用JavaScript日期对象,它会丢失精度并显示错误的日期。如果我尝试使用与“dd/mm/yyyy”对应的字符串,它也会失败 我发现,要使MicrosoftExcel具有格式为dd/mm/yyyy的精确日期,您需要使用Excel序列格式,它遵循一种模式 以下是该格式的一些示例:在JavaScript中将日期(dd/mm/yyyy)转换为Excel序列号,javascript,excel,date,xlsx,Javascript,Excel,Date,Xlsx,说明: 我在角度项目上使用XLSX(npm安装XLSX)生成Excel文件,但我在显示精确日期时遇到问题。如果我尝试使用JavaScript日期对象,它会丢失精度并显示错误的日期。如果我尝试使用与“dd/mm/yyyy”对应的字符串,它也会失败 我发现,要使MicrosoftExcel具有格式为dd/mm/yyyy的精确日期,您需要使用Excel序列格式,它遵循一种模式 以下是该格式的一些示例: 日期:1900年1月1日-序列号:1 日期:1900年1月2日-序列号:2 日期:1900年4月9
- 日期:1900年1月1日-序列号:1
- 日期:1900年1月2日-序列号:2
- 日期:1900年4月9日-序列号:100
- 日期:1902年9月26日-序列号:1000
- 日期:1913年9月8日-序列号:5000
- 日期:1927年5月18日-序列号:10000
- 日期:1998年7月24日-序列号:36000
private JSDateToExcelDate(inDate) {
if(inDate != null) {
//TO DO
}
}
其他信息:
xlsx框架可以修改任何单元格,告诉它值类型将是Date。考虑到这一点,我只需要序列号格式的日期
更新日期:2019年6月11日-20:14
我已经找到了一个解决方案,该解决方案使用以下函数提供我想要的号码。我部分地解决了这个问题,因为框架XLSX可能正在更改该值,因为我得到的输出是“31/12/1969 21:00:16”,我发现这是一个与某个无效日期相关的默认输出。(我在Angular项目上创建了函数,因此它可能包含特定语法)
private JSDateToExcelDate(日期){
变量温度:任何;
临时=新日期(日期);
如果(日期!=“NaN”&&date!=“无效日期”){
变量天数=数学轮((温度设定小时(0,0,0,0)-新日期(1899,11,30))/8.64e7);
设ret:any=(天)。toFixed(10);
如果(!isNaN(ret)){
返回ret;
}
}
返回“”;
}
你试过使用momentjs吗?@RafaelLucini我试过,但它显示的日期不准确excel@RafaelLucini我也尝试过这个功能。事实并非如此work@Screll-不。小数部分始终为正,但在1899-12-30之前整数部分为负。所以1899年12月29日的早上6点是-1.25(即-1天,加上0.25天),而不是-0.75;-)时区?或者floor
it?纪元是1899-12-30 00:00:00,数值的小数部分与数值的整数日部分分开。这对于纪元之后的日期来说很简单,但意味着这两部分必须在纪元之前分别计算。
private JSDateToExcelDate(date) {
var temp: any;
temp = new Date(date);
if(date != "NaN" && date != "Invalid Date") {
var days = Math.round((temp.setHours(0,0,0,0) - <any>new Date(1899, 11, 30)) / 8.64e7);
let ret:any = (days).toFixed(10);
if(!isNaN(ret)) {
return ret;
}
}
return '';
}
var start = new Date('1900-01-01')
return (inDate - start)/(1000 * 60 * 60 * 24);