java中两个日期字符串之间的差异
我试图计算两个日期字符串之间的差异,这两个字符串都是通过格式为(yyyy/MM/dd)的html表单从用户处获取的 代码: 其中error.duedate.required映射到“检查日期”java中两个日期字符串之间的差异,java,Java,我试图计算两个日期字符串之间的差异,这两个字符串都是通过格式为(yyyy/MM/dd)的html表单从用户处获取的 代码: 其中error.duedate.required映射到“检查日期” 因此,问题是两个日期字符串的任何值都会打印“check date”错误。您正在测试两个日期是否相差3毫秒,这几乎总是正确的。如果确实需要3天,则该值应为3*86400*1000。如果您关心闰秒和夏令时变化会发生什么,那么问题就会变得更复杂。您正在测试两个日期是否相差3毫秒,这几乎总是正确的。如果确实需要3天
因此,问题是两个日期字符串的任何值都会打印“check date”错误。您正在测试两个日期是否相差3毫秒,这几乎总是正确的。如果确实需要3天,则该值应为3*86400*1000。如果您关心闰秒和夏令时变化会发生什么,那么问题就会变得更复杂。您正在测试两个日期是否相差3毫秒,这几乎总是正确的。如果确实需要3天,则该值应为3*86400*1000。如果您关心闰秒和夏令时变化会发生什么,那么问题会变得更复杂。您的条件diff3相当于diff!=3和差异以毫秒表示。此表达式永远不会为真。您的条件diff3等同于diff!=3和差异以毫秒表示。此表达式永远不会为真。如果解析日期的分辨率为1天,即86.000.000毫秒,则永远不会出现它们相差3毫秒的情况 getTime()返回自“纪元开始”以来的时间(毫秒),因此它返回毫秒,或1/1000秒
diff < 3 || diff > 3
如果您想检测到正好相差3天的日期,可以在比较之前将毫秒数除以毫秒数。如果您以1天的分辨率(即86.000.000毫秒)解析日期,您将永远不会得到它们正好相差3毫秒的情况 getTime()返回自“纪元开始”以来的时间(毫秒),因此它返回毫秒,或1/1000秒
diff < 3 || diff > 3
如果您想检测到正好相差3天的日期,可以在比较之前将毫秒数除以毫秒数。从yyyy/MM/dd格式的字符串中获取的两个日期之间永远不会相差3毫秒(最大精度为24小时)
如果您想要3天的差异,请使用
24*60*60*1000
作为缩放值的因子从yyyy/MM/dd格式的字符串中获取的两个日期之间的差异永远不会精确到3毫秒(最大精度为24小时)
如果需要3天的差异,请使用
24*60*60*1000
作为一个因子来缩放值java.util.Calendar有一个方法add
,该方法使用数量和时间单位,还有一个称为compareTo
的方法,该方法使用另一个日历。您应该使用它们。java.util.Calendar有一个方法add
,它使用一个数量和一个时间单位,还有一个名为compareTo
的方法,它使用另一个日历。你应该使用这些工具。tl;博士
使用java.time
现代方法使用类,而不是麻烦的旧遗留日期时间类(date
,Calendar
,等等)
您的输入字符串几乎符合仅日期值的标准格式:YYYY-MM-DD。要完全符合此格式,请将斜杠字符替换为连字符
String inputA = "2017/01/23".replace( "/" , "-" ) ;
String inputB = "2017/02/14".replace( "/" , "-" ) ;
默认情况下,java.time类在解析/生成字符串时使用标准格式。因此,无需指定格式化模式
LocalDate ldA = LocalDate.parse( inputA );
LocalDate ldB = LocalDate.parse( inputB );
你的问题的其余部分没有意义,因为它测试了+/-三毫秒,这在日期之间不可能是真的。很明显你是想检查几天。为此,请使用枚举
如果第二个日期实际发生在第一个日期之前,则结果为负数。您似乎希望使用±3的公差测试这两种情况。使用类的方法来测试结果的绝对值
该方法返回一个long
原语。因此,我们的测试将该结果与三个极限进行比较,必须与该类型相匹配。请注意,使用L
表示3L
是三种类型的原始值long
。编译器可能会将3
的默认值从int
(32位)升级到long
(64位),但我更喜欢使用3L
来显式
if( abs( daysBetween ) > 3L ) { … }
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 从哪里获得java.time类
- ,及以后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 该项目专门为Android采用了ThreeTen Backport(如上所述)
- 看
date
,Calendar
,等等)
您的输入字符串几乎符合仅日期值的标准格式:YYYY-MM-DD。要完全符合此格式,请将斜杠字符替换为连字符
String inputA = "2017/01/23".replace( "/" , "-" ) ;
String inputB = "2017/02/14".replace( "/" , "-" ) ;
默认情况下,java.time类在解析/生成字符串时使用标准格式。因此,无需指定格式化模式
LocalDate ldA = LocalDate.parse( inputA );
LocalDate ldB = LocalDate.parse( inputB );
你的问题的其余部分没有意义,因为它测试了+/-三毫秒,这在日期之间不可能是真的。很明显你是想检查几天。为此,请使用枚举
如果第二次约会
long daysBetween = ChronoUnit.DAYS.between( ldA , ldB );
if( abs( daysBetween ) > 3L ) { … }