2017-10-10 1145 views
0

我正在读取Excel表格中的数据,第5列是日期字段。我有以下的逻辑,以确保输入的日期将转换为YYYY-MM-DD格式 -从nodejs中的xlsx文件获取统一的日期格式

var valid_from = new Date(data[counter][5]); 
valid_from_new = var formatedDate = moment(valid_from).format("YYYY-MM-DD"); 
reqBody.valid_from = valid_from_new.toString(); 

我有日期2017-10-10开始用,我能够通过我的节点应用精细读它。只要我不在Microsoft Excel 2010中编辑此字段,它就可以工作。如果我编辑它或只是查找/替换值,我会在reqBody.valid_from中获得unix默认日期(1970-01-01)。

要找出更换后会发生什么,我检查,如果我取代2017-10-102017-10-20然后“清格式”(EXCEL工具),我得到43028显示在纸张,而对于日2017-10-10它仍然是相同的,即2017-10-10。我不明白为什么excel的行为如此。

这可以由我的应用程序统一处理吗?我只想让“YYYY-MM-DD”格式适用于任何Excel版本。如果在提供文件之前可以进行一次格式更改或清除格式,那就没有问题,并且可以正常工作。

回答

0

我不明白为什么excel的行为如此。

Excel的行为就像它存储2017-10-10作为一个序列日期。这意味着它是一个整数,表示从1900年1月1日起Windows系统已过去的天数。 (可能为1905或类似的mac)。在你的具体情况下,它显然是43028.它显示了一个格式为人们阅读为2017-10-10在你的情况下的转换日期。你会注意到这一点,因为你的单元格格式可能是某种类型的日期或自定义用户格式。如果您通过将日期作为文本输入'来输入日期,您会注意到当您更改单元格格式时,格式不会更改。日期实际上只是文本而不是格式化的日期。以类似excel日期的格式输入的数字,excel通常会尝试自动将它们转换为您的序列日期值。它有一个内置的格式列表,我相信也会查看你的系统设置格式。

作为附注,数字的小数部分表示时间。一天的分数。 0是00:00:00,.5是12:00:00。

这可以由我的应用程序统一处理吗?

我相信对此的回答是“是”,但超出了我的专长。我高度怀疑这是因为你的代码最初是作为文本处理它的。当它从Excel中接收表示日期的Excel中的整数时,事情就会出错。

+0

感谢您的回答。我将解析值以便稍后进行字符串处理。如果我指示将工作表添加到系统中以确保日期字段被格式化为文本之前的团队,您认为这可能是一个问题吗? –

+0

通常以日期存储的日期更适合工作,因为很多代码都有处理日期的特殊例程。所以将它作为日期存储会让你稍后转换它的过程。其次,将日期存储为日期而不是字符串可能会减少内存。如果你打算让它们先把它作为一个字符串存储起来,那么当它没有发生时,你需要强制执行或处理错误。 –