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 查找小时之间的持续时间_Java_Date_Time_Duration - Fatal编程技术网

Java 查找小时之间的持续时间

Java 查找小时之间的持续时间,java,date,time,duration,Java,Date,Time,Duration,我想计算两个小时之间的持续时间 SimpleDateFormat defaultFormat = new SimpleDateFormat("HH:mm"); Date hour1 = defaultFormat.parse(time1); Date hour2 = defaultFormat.parse(time2); duration = (time2.getTime() - time1.getTime()) / (1000*60); //to minutes /* hours= durat

我想计算两个小时之间的持续时间

SimpleDateFormat defaultFormat = new SimpleDateFormat("HH:mm");
Date hour1 = defaultFormat.parse(time1);
Date hour2 = defaultFormat.parse(time2);
duration = (time2.getTime() - time1.getTime()) / (1000*60); //to minutes
/* hours= duration/60 (hours)  minutes = duration%60 (minutes)
特别是当小时1为“22:15”和小时2为“01:15”时,问题会出现。上述代码保存到“duration=1260”(21小时)


如何才能在没有任何错误的情况下找到两个小时之间的差异?

请注意,您可能会遇到夏令时时区转换日期,然后23:00和3:00之间的差异可能是4、3或5小时。 我建议您在Java 7中使用JodaTime和类,或者在Android或任何其他Java应用程序中操作日期和时间时使用我建议您使用的

。它比本机Java date类强大得多

以下是使用Joda时间的示例:

DateTime startTime;
DateTime endTime;
Period p = new Period(startTime, endTime);
int hours = p.getHours();
int minutes = p.getMinutes();
功能,而不是bug。 您不恰当地使用日期时间类来表示一天中的某个时间值。此外,您使用的是麻烦的旧类,现在是遗留类,被java.time类取代

仅将类用于时间值,不带日期,也不带时区或偏移量

LocalTime lt = LocalTime.of( "22:15" ) ;
你可以用这门课做数学

只使用一天中的某个时间值的方法是24小时不停地工作,跨越午夜。没有日期的背景,你怎么能期待一个合适的结果?从“22:15”到“01:15”,你是想进入下一天、下一周还是下一年

这个班采取不跨越午夜的方法。
LocalTime
的值范围总共为24小时,从
00:00
23:59:59.9999999
。因此,从一个较晚的时间到一个较早的时间的唯一方法是在时间上向后移动到较早的时间点,结果是一个负数

LocalTime start = LocalTime.parse ( "22:15" );
LocalTime stop = LocalTime.parse ( "01:15" );
Duration d = Duration.between ( start , stop );
转储到控制台

System.out.println ( "start/stop: " + start + "/" + stop );
System.out.println ( "d.toString(): " + d );
开始/停止:22:15/01:15

d、 toString():PT-21H

这种输出是标准的

如果要计算时间轴上实际时刻之间的时间跨度,请搜索
java.time
Duration
Period
OffsetDateTime
Instant
Interval
和“已用”的堆栈溢出。这个话题已经讨论过很多次了

举个简单的例子,让我们在区域中指定一些任意日期,从今年1月23日到24日。结果是经过了三个小时的时间。该结果可能因日期和区域而有所不同,因为异常情况如

zdtStart.toString():2017-01-23T22:15-05:00[美国/蒙特利尔]

zdtStop.toString():2017-01-24T01:15-05:00[美国/蒙特利尔]

d、 toString():PT3H

你看


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

java.time 您可以使用它,它是Java-8的一部分。Java-9引入了一些更方便的方法

演示:

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        LocalTime startTime = LocalTime.parse("22:15");
        LocalTime endTime = LocalTime.parse("01:15");

        LocalDateTime startDateTime = today.atTime(startTime);
        LocalDateTime endDateTime = today.atTime(endTime);

        if (startDateTime.isAfter(endDateTime)) {
            endDateTime = endDateTime.with(LocalTime.MIN).plusDays(1).with(endTime);
        }

        Duration duration = Duration.between(startDateTime, endDateTime);
        // Default format
        System.out.println(duration);

        // Custom format
        // ####################################Java-8####################################
        String formattedDuration = String.format("%02d:%02d:%02d", duration.toHours(), duration.toMinutes() % 60,
                duration.toSeconds() % 60);
        System.out.println(formattedDuration);
        // ##############################################################################

        // ####################################Java-9####################################
        formattedDuration = String.format("%02d:%02d:%02d", duration.toHoursPart(), duration.toMinutesPart(),
                duration.toSecondsPart());
        System.out.println(formattedDuration);
        // ##############################################################################
    }
}
PT3H
03:00:00
03:00:00
输出:

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        LocalTime startTime = LocalTime.parse("22:15");
        LocalTime endTime = LocalTime.parse("01:15");

        LocalDateTime startDateTime = today.atTime(startTime);
        LocalDateTime endDateTime = today.atTime(endTime);

        if (startDateTime.isAfter(endDateTime)) {
            endDateTime = endDateTime.with(LocalTime.MIN).plusDays(1).with(endTime);
        }

        Duration duration = Duration.between(startDateTime, endDateTime);
        // Default format
        System.out.println(duration);

        // Custom format
        // ####################################Java-8####################################
        String formattedDuration = String.format("%02d:%02d:%02d", duration.toHours(), duration.toMinutes() % 60,
                duration.toSeconds() % 60);
        System.out.println(formattedDuration);
        // ##############################################################################

        // ####################################Java-9####################################
        formattedDuration = String.format("%02d:%02d:%02d", duration.toHoursPart(), duration.toMinutesPart(),
                duration.toSecondsPart());
        System.out.println(formattedDuration);
        // ##############################################################################
    }
}
PT3H
03:00:00
03:00:00
了解有关现代日期时间API的更多信息

  • 无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7
  • 如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认

为什么你认为有一天的差异?/这些小时是在同一天内吗?如果您总是希望它们之间的距离尽可能小(忽略日期),那么它将是该值和该值中的较小值。是的,这是一个日差。但是我想知道hour1和hour2FYI之间的时间间隔,项目现在正在进行中,团队建议迁移到Java 8和更高版本中内置的类。大部分java.time功能都在中向后移植到Java6和Java7,并在中进一步适应Android。