我今天用java创作了一部杰作,我需要计算两次之间的差异。
所以我用Time.getTime()
来获取时间的长值并减去它们以得到我想要的......
这是我的测试代码:
public static void main(String[] args) {
Time time = new Time(00,00,00);
Time time2 = new Time(02,00,00);
long longTime = (time2.getTime() - time.getTime());
Time finalTime = new Time(longTime);
System.out.println(finalTime.toString());
}
现在显然打印出来的字符串必须是02:00:00
但我总是得到04:00:00
我试图改变时间,我总是把时间增加两个小时,我不知道为什么。
我甚至试图减去00:00:00和00:00:00
而不是00:00:00
我得到了02:00:00
那么,对我有什么帮助???
答案 0 :(得分:2)
问题在于,您打印的时间会转换为您的时区。基本上,时区仅用于演示,而不是日期存储的方式。你必须显示你的GMT时间,然后它会给你你想要的。像这样:
Time time = new Time(00,00,00);
Time time2 = new Time(02,00,00);
long longTime = (time2.getTime() - time.getTime());
Time finalTime = new Time(longTime);
System.out.println(finalTime.toString());
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
//correct one
System.out.println(sdf.format(finalTime));
另外我认为您使用的是java.sql.Time
类,除非您正在使用sql,否则我认为这是一个错误的类。 Date
类包含您需要的所有内容,Calendar
类也是如此。还有一些新的java时间类,我还没有使用它们看起来很有趣https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html
答案 1 :(得分:1)
时间构造函数new Time(long)
使用您的时区。
所以你的longTime
就像预期的那样是60 * 60 * 2 * 1000 = 7200000。
但new Time(7200000)
将于1970年1月1970日00:00:00 UTC / GMT + 7200000作为新日期,因此按时区移动。
对我来说,你的代码打印:03:00:00。 new Time(int, int, int)
已弃用,不应使用。
如果可能,我建议不要使用旧的日期和时间,并使用jodatime或java8:Do we have a TimeSpan sort of class in Java
答案 2 :(得分:1)
以下是使用GregorianCalendar执行操作的方法:
Calendar time = new GregorianCalendar();
Calendar time2 = new GregorianCalendar();
time2.add(GregorianCalendar.HOUR, 2);
System.out.println(time2.getTimeInMillis() - time.getTimeInMillis());
答案 3 :(得分:0)
这是交易......
首先,如果有可能,我建议不要使用Time类,因为它的方法大部分已被弃用。
而是尝试使用Date类或持续时间和即时https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html
如果你现在必须坚持这个课程,这就是诀窍。
构造函数new Time(long)
考虑时区偏移...
所以,如果你在+02时区...你的时间对象将在120分钟内增加。
要解决此问题,您可以使用Time.getTimezoneOffset()
此方法将返回一个整数,其中包含距您的时区的分钟数
我编写了我的代码,现在它正常运行:
public static void main(String[] args) {
Time time = new Time(00,00,00);
Time time2 = new Time(02,00,00);
long longTime = (time2.getTime() - time.getTime());
Time finalTime = new Time(longTime);
int timeOffset = time.getTimezoneOffset();
finalTime.setMinutes(finalTime.getMinutes()+timeOffset);
System.out.println(finalTime.toString());
}
答案 4 :(得分:0)
您在Java中使用了字面数字的前导零。这意味着octal number(基数为8)而不是十进制数(基数为10)。
您应该使用0
代替00
,2
代替02
。
此特定示例中的核心问题不太可能是八进制零和两个具有相同的十进制值。
从我的角度来看,这个问题没有实际意义。你的目标有一个更好的方法;请继续阅读。
问题和其他答案使用与最早版本的Java捆绑在一起的旧的过时日期时间类。事实证明,那些旧班级非常麻烦,有缺陷,而且设计很差。它们已经在Java 8及更高版本的java.time框架中被取代。请参阅Tutorial。
新课程包括LocalTime
,用于表示没有任何日期或任何时区的时间值。
优先于java.sql.Time
使用LocalTime
课程。 java.sql。*类仅用于将数据传入和传出数据库,而不是用于业务逻辑。特别是,java.sql.Time
类假装只有一个时间但实际上是java.util.Date
的子类(一个被黑客入侵的类设计),因此在内部它确实有一个日期和时区(均为UTC < em>和另一个隐藏在源代码中的时区,但也出于某些目的而被忽略了)。困惑?正如我所说,旧的日期时间类是一团糟,应该避免;只在绝对必要且尽可能短暂使用的地方使用。
转移后,立即将java.sql类型转换为java.time类型。 java.sql.Time
类提供toLocalTime
方法以方便转换。
LocalTime localTime = myJavaSqlTime.toLocalTime();
似乎您的问题是关于确定一对时间之间的经过时间。
请记住确定没有日期的已用时间的问题。我们必须假设通用的24小时漫长的一天,而忽略夏令时(DST)或现实世界中发生的其他异常。我们必须假设这些都是在同一天内发生的,或者延续到下一个24小时制。通常情况下,您最好将时间轴上的实际时刻表示为Instant
,ZonedDateTime
或OffsetDateTime
。
java.time框架提供了Duration
类来表示一段时间的整数秒加上nanoseconds中的一小部分。
假设您已经检索了java.sql.Time对象并将它们转换为java.time.LocalTime对象,让我们模拟从数据库中获取一对值。
LocalTime start = LocalTime.of ( 0 , 0 , 0 ); // First moment of the day.
LocalTime stop = LocalTime.of ( 2 , 0 , 0 ); // 2 AM.
将时间跨度计算为小时,分钟和秒数。
Duration duration = Duration.between ( start , stop );
转储到控制台。
System.out.println ( "start: " + start + " | stop: " + stop + " | duration: " + duration );
请注意LocalTime::toString
隐式调用的输出如何使用PnYnMnDTnHnMnS
的标准ISO 8601格式。在我们的例子中,PT2H
表示“两小时”。 java.time类可以用ISO 8601格式解析和生成。这种标准格式使用模糊的02:00:00
更加明智,这种模糊long seconds = duration.get ( ChronoUnit.SECONDS ); // 7,200 seconds in 2 hours.
无法与时间区分开来。
开始:00:00 |停止:02:00持续时间:PT2H
如果您想要数字,您可以在持续时间内获得总秒数。请记住,持续时间可能包括一小秒的纳秒也可以通过获得整秒来忽略。
to
或调用toMinutes
方法,例如toHours
或power <- function(exponent) {
function(x) {
x ^ exponent
}
}
,以获取持续时间作为这些单位的总数。
如果您打算将这些通用时间值应用于特定日期以获取时间轴上的实际时刻,请搜索已覆盖的Stack Overflow。