Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java日期问题,查找X天前的日期_Java_Date - Fatal编程技术网

Java日期问题,查找X天前的日期

Java日期问题,查找X天前的日期,java,date,Java,Date,如果numdaysback是365,那么我想这个日期应该是一年前。但这不是。。。大约三周前了 Date nowdate = new Date(); long nowms = nowdate.getTime(); long differencems = numdaysback * 24 * 60 * 60 * 1000; long thenms = nowms - differencems; Date thendate = new Date(thenms); 那么: NUMDAYSBACK: 3

如果numdaysback是365,那么我想这个日期应该是一年前。但这不是。。。大约三周前了

Date nowdate = new Date();
long nowms = nowdate.getTime();
long differencems = numdaysback * 24 * 60 * 60 * 1000;
long thenms = nowms - differencems;
Date thendate = new Date(thenms);
那么:

NUMDAYSBACK: 365
NOWDATE: Wed Jun 22 20:31:58 SGT 2011
NOWMS: 1308745918625
DIFFERENCEMS: 1471228928
THENMS: 1307274689697
THENDATE: Sun Jun 05 19:51:29 SGT 2011
返回一天中的同一时间,无论是DST还是闰年,都更短更清晰

通常情况下,
Calendar
是这种情况下的方法(除非您使用像Joda Time这样的第三方库)。你可以使用它进行各种计算:增加N天/小时/月/秒,将时间缩短为一整小时等等——仅使用
long
就太痛苦了

关于您最初的问题,它似乎是整数溢出的受害者。如果乘法显式使用long:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, -1);
Date thendate = cal.getTime();
这一行:

long differencems = 365 * 24 * 60 * 60 * 1000L;
RHS应为:31536000000。你得到的东西要少得多,原因是RHS被计算为int(因为所有的量都是int),并且你超过了MAX_int。要纠正这一点:

long differencems = numdaysback * 24 * 60 * 60 * 1000;
请注意“l”表示1000为长-现在RHS将被评估为长。

请尝试以下操作:

long differencems = numdaysback * 24 * 60 * 60 * 1000l;
使用新代码,您不会因为整数乘法而丢失数字。
因为我们已经将文字24标记为long,所以乘法将通过自动将第一个操作数numdaysback转换为long来完成。乘法的其余部分也将在长操作数上进行。

不推荐使用
Date
类。API有太多的错误,因此很难用它正确地获取日期/时间。最简单的例子是类似于
differencems
的代码。如果中间的时间包含夏令时开关(如果不使用UT),并且始终无法处理闰秒,则它将失败


如果您的应用程序依赖于正确的日期,您可能希望使用。

如果您使用的是Java 8及更高版本,您可以使用较新的库来更干净地执行此操作

long differencems = numdaysback * 24L * 60 * 60 * 1000;

谢谢大家。我将按照大家的建议使用日历。+1告诉他出了什么问题,而不是简单地给出解决方案。仅供参考,非常麻烦的旧日期时间类,例如,和
java.text.SimpleDateFormat
,现在被java 8和更高版本中内置的类所取代。看,回答得好。可以改进:(a)说明您正在将麻烦的遗留类
Date
与现代替代类java.time混合使用,以明确解决要求
Date
的问题。(b) 解释您在UTC工作时,将一般的24小时时间段作为“一天”,不考虑日历/日期,也不考虑时区,因为这似乎是问题所要寻找的。几乎正确。从夏季时间(DST)到夏季时间(DST)的转换不是24小时,您的代码没有考虑到这一点(问题中的代码也有同样的问题)。仅供参考,非常麻烦的旧日期时间类,如和
java.text.simpleDataFormat
,现在被java 8和更高版本中内置的类所取代。看见
Date xDaysAgo = Date.from( Instant.now().minus( Duration.ofDays( x ) ) );