Excel 日期格式与数字格式转换的BUG

Excel 2003 中的单元格式可以有多种, 如下图:



其中日期/时间可以与数字进行互转, 但前提是这些日期/时间必须是Excel能识别的格式, 例如: 输入2009-12-24 , 转换为数字是:40171

输入2009-12-24 10:10:10, 转换为数字是40171., 官方说法其日期是以1900年1月1日为起始日, 时间以午夜零时为起始时间.



MS SQL Server 2005 的datetime类型的日期时间也是以1900年1月1日零时作为起始点, 我想, 当我们以这个数值(40171.4237268519)插入MS SQL Server 2005 字段为datetime 类型的表时, 产生的日期应该是: 2009-12-24 10:10:10 ,


但很可惜, 实际上得到的却是:




比预期的多出了两天!!! 为什么?

同是微软的东西, 难道算法还会不一致?


原来这里面有一个很隐蔽的BUG(不知道算不算BUG):


先在Excel的某个单元格上设置格式为日期格式, 然后输入0, 回车! 结果是1900-1-0 , 晕了原来Excel的参考起始日期并不是官方说的1900-1-1 , 而是1900-1-0 , 这样算出来的日期就比如SQL Server算出来的多出了一天!

 

再次在单元格上输入60 , 然后回车, 结果是1900-2-29 ! 微软真能搞, 1900年并不是润年(真正的判断法则是:能被4或400整除,但不能被100整除的年份为闰年), 所以这里又多出了一天!

 

所以Excel算出来的日期数值与SQL Server算出来的日期数值相差2 天!


在Kettle中处理日期格式转换的步骤如下: 1. 首先,您需要使用Java的SimpleDateFormat类来定义您想要的日期格式。您可以使用类似于以下代码的方式创建一个SimpleDateFormat对象: ```java java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(dateFormat); ``` 2. 接下来,您需要使用转换函数来将日期字符串转换为特定格式日期对象。在您的代码中,使用的是JavaScript代码,您可以将其转换为Kettle的JavaScript脚本步骤。 您可以使用类似于以下的代码来定义一个转换函数: ```javascript function trans(time) { var str = time; var a = str.split("T").join(" "); var b = a.substring(0, 19); var c = b.replace(/-/g, "/"); var date = new Date(c); return date.getTime(); } ``` 3. 然后,您可以使用Kettle的JavaScript脚本步骤中的转换函数来将日期字符串转换为特定格式日期对象。在您的代码中,您可以像这样使用转换函数: ```javascript var publishTime = trans("2022-04-15T00:00:00 08:00"); var validDateStart = trans("2022-04-15T00:00:00 08:00"); var validDateEnd = trans("2022-04-15T00:00:00 08:00"); ``` 4. 最后,您可以将转换后的日期对象用于Kettle中的日期处理。根据您的需求,您可以将日期对象传递给Kettle的相关组件或步骤进行后续处理。 综上所述,要在Kettle中处理日期格式转换,您需要使用SimpleDateFormat类定义日期格式,编写转换函数将日期字符串转换日期对象,然后在Kettle中使用转换后的日期对象进行处理。请注意,这是一种示例方法,您可以根据您的具体需求进行适当的修改和调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span> #### 引用[.reference_title] - *1* *3* *4* [(BUG)Kettle8.1.0.0-365转换步骤输出SQL文件insert脚本日期类型数据,格式不正确且没有双引号](https://blog.csdn.net/weixin_28953369/article/details/114307563)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [kettle中关于js处理Date日期数据,将日期格式改为时间戳](https://blog.csdn.net/weixin_44047573/article/details/124252448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值