Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中将日期(dd/mm/yyyy)转换为Excel序列号_Javascript_Excel_Date_Xlsx - Fatal编程技术网

在JavaScript中将日期(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

说明

我在角度项目上使用XLSX(npm安装XLSX)生成Excel文件,但我在显示精确日期时遇到问题。如果我尝试使用JavaScript日期对象,它会丢失精度并显示错误的日期。如果我尝试使用与“dd/mm/yyyy”对应的字符串,它也会失败

我发现,要使MicrosoftExcel具有格式为dd/mm/yyyy的精确日期,您需要使用Excel序列格式,它遵循一种模式

以下是该格式的一些示例:

  • 日期: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
*您可以在MicrosoftExcel上尝试,以查看更多示例

上面是我需要的函数的原型,它将接收一个日期(dd/mm/yyyy),并返回它的等效序列号

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);