excel 无法正确处理 1900-03-01 前的日期

2024-04-17 11:12

本文主要是介绍excel 无法正确处理 1900-03-01 前的日期,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题由来:excel 用公式 =TEXT(A1,"yyyy-mm-dd") 转日期时,当A1 的值等于59 的时候,返回值是1900-02-28;当A1 的值等于61 的时候,返回值是1900-03-01;那么当 A1的值为 60 的时候,返回值是多少?

根据给出的信息,当A1的值为59时,返回值是1900-02-28,而当A1的值为61时,返回值是1900-03-01。这意味着A1的值每增加1,日期增加一天。

因此,当A1的值为60时,日期应该是在1900-02-28和1900-03-01之间的一天,即1900-02-29。

但是,需要注意的是1900年并不是闰年,所以1900年没有2月29日。在这种情况下,Excel通常会将日期调整到下一天,即1900-03-01。

然而,根据题目中的描述,我们假设Excel在这里的处理方式是简单地忽略闰年规则,将日期直接加一天。

因此,当A1的值为60时,返回值将是1900-02-29。

在Excel中,日期是从1900年1月1日开始计算的,其中1900年1月1日对应序号1。Excel错误地将1900年当作闰年来处理,实际上1900年并不是闰年。这导致2月29日被错误地认为是有效日期。

当A1的值为59时,对应的日期是1900-02-28,增加1变为60,按照正常逻辑应当是1900-03-01,但由于Excel的这个错误,它会将1900年2月29日作为一个有效的日期来处理。

因此,当A1的值为60时,由于Excel的错误处理,返回值会错误地显示为1900-02-29,即使这一天在现实中并不存在。

所以确实可以认为这是一个BUG,但这是Excel的一个已知问题,而且是一个历史性的问题,自Excel最初版本以来就存在,并且在后续版本中为了兼容性的原因一直保留至今。

返回值是1900-02-29。

DateDiff("d", "1899-12-31", "1900-3-1") 返回值 60 是错误的,

DateDiff 函数的本意是计算两个日期之间的差值,通常不会考虑日期系统误差。然而,由于Excel中1900年日期系统的错误处理,导致在计算涉及1900年2月的日期差值时会出现问题。在这个具体的例子中:

DateDiff("d", "1899-12-31", "1900-3-1") 应该计算的是从1899年12月31日到1900年3月1日之间的天数。
正常情况下,这应该是61天(1月份31天 + 2月份28天 + 3月1日),因为1900年不是闰年。
但是由于Excel错误地将1900年作为闰年处理,它认为2月有29天,因此返回了错误的天数60。
这个问题没有直接的解决办法,因为它根植于Excel的底层日期处理机制。当使用DateDiff函数计算包含1900年2月的日期差值时,需要手动调整结果以抵消这个错误。

此外,在使用DateDiff进行日期差值计算时,应当注意以下几点:

确保日期正确:检查所有日期数据确保其准确性,特别是涉及到1900年的日期。
避免使用1900年2月的日期:在可能的情况下,避免使用1900年2月的日期作为计算范围的一部分,以免产生错误的结果。
手动调整:如果必须使用1900年的日期,可能需要在计算后手动调整结果以反映实际的日期差值。

DateDiff("d", 0, "1900-1-1") 返回值是 2 也是错误的。

Excel中的日期是从1900年1月1日开始计算的,其中1900年1月1日被当作第1天。因此,当使用DateDiff函数计算从基准日期(即1900年1月1日)到"1900-1-1"这一日期之间的天数差时,实际上就是在计算基准日期自身,所以结果是0。但是,由于某些原因,可能是由于四舍五入或内部处理误差,Excel错误地返回了2。

DATEVALUE("1900-02-29") 返回值是 60 ,是什么BUG?

这是由于Excel的日期系统BUG导致的。

在Excel中,日期是以一种称为序列号的数字形式存储的,起始点是1900年1月1日。理论上,1900年2月29日应该是第60天的序列号,因为1900年并不是一个闰年。但是,Excel错误地将1900年视为闰年,因此它将2月29日计入了序列号中。这就是为什么DATEVALUE("1900-02-29")返回值是60的原因。

这个BUG源于Excel最初的设计决策,当时并没有考虑到1900年实际上不是闰年。这一错误一直保留至今,尽管后续版本的Excel已经可以正确处理大多数日期问题。

需要注意的是,在使用DATEVALUE函数时,需要确保输入的日期文本格式正确,否则可能会遇到错误或不一致的结果。例如,如果电脑系统时间设置与Excel中的日期格式不匹配,可能会导致一些日期函数无法正常工作。

Excel 无法正确处理 1900-03-01 前的日期

主要是因为它使用了 1900 年作为日期的起始点。这导致了一些与现实不符的情况,例如将 1900 年错误地视为闰年。

为了解决这个问题,可以采取以下措施:

使用正确的日期格式:确保输入的日期符合正确的格式,如 "YYYY-MM-DD"。这可以帮助 Excel 正确解析和处理日期数据。
避免使用 1900 年 2 月 29 日:由于 Excel 错误地将 1900 年视为闰年,因此应避免使用该日期进行计算。可以选择其他日期或手动调整结果以纠正误差。
使用其他工具或编程语言:如果需要进行复杂的日期计算或处理大量数据,可以考虑使用其他工具或编程语言,如 Python 或 R。这些工具通常具有更强大的日期处理功能,并且不受 Excel 的限制。
更新系统设置:在某些情况下,可能需要更新操作系统或 Excel 的设置以解决日期问题。例如,某些版本的 Windows 可能需要更新以解决与 1900 年 2 月 29 日相关的问题。
总之,虽然 Excel 在处理日期方面存在一些限制和问题,但通过采取适当的措施,仍然可以有效地处理和计算日期数据。

本来计划自己写个程序将字符串日期转换为Excel默认的日期计数值,但是因为以上问题,无法得到正确的结果,代码如下:

Public Function StrDT2Long(d, Optional n = "d") As LongDim S As String, SSSS = "1899-12-31"S = CStr(d)StrDT2Long = DateDiff(n, SS, S)
End Function

以上函数能正确处理 1900-1-1 到 1900-2-28 之前的日期输入,但是之后的就是错误的,结果少了1。于是乎进行修改,将 SS 改为 0 :

Public Function StrDT2Long(d, Optional n = "d") As LongDim S As String, SSSS = 0 '"1899-12-31"S = CStr(d)StrDT2Long = DateDiff(n, SS, S)
End Function

这样可以正确处理 1900-3-1 至今的日期,但是无法正确处理 1900-3-1 之前的日期,结果多了1 。

因此,在 Excel 中处理 1900-3-1 之前的日期都要注意核对结果,

因为excel中存在 1900-01-00 和 1900-02-29 两个无效的日期。

因此处理现在的日期时,以上函数 SS 的值选择设为 0 即可,不要用1900-1-1、1899-12-31或1899-12-30。

这篇关于excel 无法正确处理 1900-03-01 前的日期的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/911641

相关文章

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

Java日期类详解(最新推荐)

《Java日期类详解(最新推荐)》早期版本主要使用java.util.Date、java.util.Calendar等类,Java8及以后引入了新的日期和时间API(JSR310),包含在ja... 目录旧的日期时间API新的日期时间 API(Java 8+)获取时间戳时间计算与其他日期时间类型的转换Dur

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元