java中两个日期字符串之间的差异

java中两个日期字符串之间的差异,java,Java,我试图计算两个日期字符串之间的差异,这两个字符串都是通过格式为(yyyy/MM/dd)的html表单从用户处获取的 代码: 其中error.duedate.required映射到“检查日期” 因此,问题是两个日期字符串的任何值都会打印“check date”错误。您正在测试两个日期是否相差3毫秒,这几乎总是正确的。如果确实需要3天,则该值应为3*86400*1000。如果您关心闰秒和夏令时变化会发生什么,那么问题就会变得更复杂。您正在测试两个日期是否相差3毫秒,这几乎总是正确的。如果确实需要3天

我试图计算两个日期字符串之间的差异,这两个字符串都是通过格式为(yyyy/MM/dd)的html表单从用户处获取的 代码:

其中error.duedate.required映射到“检查日期”


因此,问题是两个日期字符串的任何值都会打印“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(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

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 );
你的问题的其余部分没有意义,因为它测试了+/-三毫秒,这在日期之间不可能是真的。很明显你是想检查几天。为此,请使用枚举

如果第二次约会
long daysBetween = ChronoUnit.DAYS.between( ldA , ldB );
if( abs( daysBetween ) > 3L ) { … }