Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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 下周怎么算?_Java_Time - Fatal编程技术网

Java 下周怎么算?

Java 下周怎么算?,java,time,Java,Time,我想精确地计算从给定日期算起一周的时间,但是我得到的输出提前了一个小时。 代码: 输出: now: Wed Sep 16 09:52:36 IRDT 2015 next week: Wed Sep 23 08:52:36 IRST 2015 我怎样才能正确计算呢?试试这个 Calendar cal = Calendar.getInstance(); System.out.println(cal.getTime()); cal.add(Calendar.DAY_OF_MONTH, 7);

我想精确地计算从给定日期算起一周的时间,但是我得到的输出提前了一个小时。

代码:

输出:

now: Wed Sep 16 09:52:36 IRDT 2015
next week: Wed Sep 23 08:52:36 IRST 2015
我怎样才能正确计算呢?

试试这个

Calendar cal = Calendar.getInstance();

System.out.println(cal.getTime());

cal.add(Calendar.DAY_OF_MONTH, 7);

System.out.println(cal.getTime());

这是因为时区不同。is+0430和is+0330

要解决此问题,您可以使用JodaTime

LocalDateTime now = LocalDateTime.now();
LocalDateTime nextweek = now.plusDays(7);
System.out.println(now);
System.out.println(nextweek);

正如其他人所说。最好使用日历或JodaTime库但问题是为什么没有得到期望的结果。这是因为
currentTimeMillis()
计算“计算机时间”和协调世界时(UTC)之间的时间。现在考虑以下情况:

long DURATION = 7 * 24 * 60 * 60 * 1000;
Date now = new Date();
Date nextWeek = new Date(now.getTime() + DURATION);
System.out.println("      now: " + now);
System.out.println("next week: " + nextWeek);
这里
Date.getTime()
每次从格林威治标准时间00:00:00开始计算时间,然后当转换为字符串时,将给出本地时区的时间

编辑: 我错了。原因如前所述

实际的“原因”是IRDT(伊朗昼间时间)在9月结束 二十二号。这就是为什么OP帖子中的第一个日期(9月16日)是 显示为IRDT,第二个日期(9月23日)显示为 第一。因为IRST(伊朗标准时间)比IRDT早一个小时 显示的时间是08:52:36,而不是09:52:36


永远不要依赖毫秒算术,因为有太多的规则和陷阱使它变得有价值(即使在很短的时间跨度内),而是使用专用的库,如Java 8的time API、JodaTime或甚至
Calendar

爪哇8 哪个输出

2015-09-16T15:34:14.771
2015-09-23T15:34:14.771
2015-09-16T15:35:19.954
2015-09-23T15:35:19.954
Wed Sep 16 15:36:39 EST 2015
Wed Sep 23 15:36:39 EST 2015
乔达蒂姆 哪个输出

2015-09-16T15:34:14.771
2015-09-23T15:34:14.771
2015-09-16T15:35:19.954
2015-09-23T15:35:19.954
Wed Sep 16 15:36:39 EST 2015
Wed Sep 23 15:36:39 EST 2015
历法 当您不能使用Java 8或JodaTime时

Calendar cal = Calendar.getInstance();
Date now = cal.getTime();
cal.add(Calendar.DATE, 7);
Date then = cal.getTime();

System.out.println(now);
System.out.println(then);
哪个输出

2015-09-16T15:34:14.771
2015-09-23T15:34:14.771
2015-09-16T15:35:19.954
2015-09-23T15:35:19.954
Wed Sep 16 15:36:39 EST 2015
Wed Sep 23 15:36:39 EST 2015

nb:您似乎遇到的“问题”根本不是问题,只是在这段时间内,您的时区似乎已经进入/退出了日光节约,因此
Date
显示了时间,并且具有正确的偏移量

使用Java 8的时间API,使用JodaTime,使用
Calendar
出于理智之爱,但不要试图使用毫秒arithmetic@MadProgrammer事实上,如果你还没有使用Joda Time,现在你最好使用threetenbp,而不是不确定它是否有用,或者你的原始程序是否正常工作。“2015年9月16日星期三09:52:36 IRDT”和“2015年9月23日星期三08:52:36 IRST”之间的差异正好是一周。如果第二个日期为“Wed Sep 23 09:52:36 IRST 2015”,则差异为一周和一小时,这不符合您的要求“精确计算一周的时间”。或者你的意思是“大约一周内同一工作日的同一时间”?Duh du daaaah,@Alen你能告诉我你的时区和地点吗?实际的“原因”是IRDT(伊朗昼时)在9月22日结束。这就是为什么OP帖子中的第一个日期(9月16日)显示为IRDT,第二个日期(9月23日)显示为IRST。因为IRST(伊朗标准时间)比IRDT早一个小时,所以显示的时间是08:52:36,而不是09:52:36。只有当用户恰好位于时区时,此代码才有效,因为两个日期之间没有时区变化。例如,添加行-cal.setTimeZone(TimeZone.getTimeZone(“伊朗”);-在“日历”示例中,将生成不同的输出。因此,这些示例不适用于将伊朗作为默认时区的用户(如原始海报)。给定日期并在其上添加7天对日期的基本表示几乎没有影响,日期的表示格式将取决于当地的具体要求,但是基本的毫秒表示形式将保持不变,因为它基于单个时间点。此外,我的论点不是关于日期的格式如何改变我的值,而是什么是更好的dat算术机制我同意。但是,结果与在OP示例中添加毫秒没有任何不同。OP体验的问题来自两个日期的不同时区表示,不能通过以不同的方式添加7天来解决。那么他们的实际问题就不是问题(除了他们使用糟糕的方法来实现这一点之外),夏令时发生变化的事实并没有改变这样一个事实,即未来的结果仍然是+7天,并且有补偿