简体   繁体   English

我如何计算Java中的时差?

[英]How can I calculate a time difference in Java?

I want to subtract two time periods say 16:00:00 from 19:00:00.我想从 19:00:00 减去两个时间段,比如 16:00:00。 Is there any Java function for this?这有什么Java函数吗? The results can be in milliseconds, seconds, or minutes.结果可以以毫秒、秒或分钟为单位。

Java 8 has a cleaner solution - Instant and Duration Java 8 有一个更干净的解决方案——Instant 和 Duration

Example:例子:

import java.time.Duration;
import java.time.Instant;
...
Instant start = Instant.now();
//your code
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
System.out.println("Time taken: "+ timeElapsed.toMillis() +" milliseconds");
String time1 = "16:00:00";
String time2 = "19:00:00";

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
Date date1 = format.parse(time1);
Date date2 = format.parse(time2);
long difference = date2.getTime() - date1.getTime(); 

Difference is in milliseconds.差异以毫秒为单位。

I modified sfaizs post .我修改了 sfaizs 的帖子

To get pretty timing differences, then为了获得漂亮的时间差异,然后

// d1, d2 are dates
long diff = d2.getTime() - d1.getTime();

long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000) % 24;
long diffDays = diff / (24 * 60 * 60 * 1000);

System.out.print(diffDays + " days, ");
System.out.print(diffHours + " hours, ");
System.out.print(diffMinutes + " minutes, ");
System.out.print(diffSeconds + " seconds.");

Java 8 Java 8

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

LocalDateTime dateTime1= LocalDateTime.parse("2014-11-25 19:00:00", formatter);
LocalDateTime dateTime2= LocalDateTime.parse("2014-11-25 16:00:00", formatter);

long diffInMilli = java.time.Duration.between(dateTime1, dateTime2).toMillis();
long diffInSeconds = java.time.Duration.between(dateTime1, dateTime2).getSeconds();
long diffInMinutes = java.time.Duration.between(dateTime1, dateTime2).toMinutes();

Just like any other language;就像任何其他语言一样; convert your time periods to a unix timestamp (ie, seconds since the Unix epoch) and then simply subtract.将您的时间段转换为 unix 时间戳(即自 Unix 纪元以来的秒数),然后简单地减去。 Then, the resulting seconds should be used as a new unix timestamp and read formatted in whatever format you want.然后,生成的秒数应该用作新的 unix 时间戳,并以您想要的任何格式读取。

Ah, give the above poster (genesiss) his due credit, code's always handy;) Though, you now have an explanation as well:)啊,给上面的海报(起源)他应有的功劳,代码总是很方便;)虽然,你现在也有一个解释:)

import java.util.Date;
...
Date d1 = new Date();
...
...
Date d2 = new Date();
System.out.println(d2.getTime()-d1.getTime()); //gives the time difference in milliseconds. 
System.out.println((d2.getTime()-d1.getTime())/1000); //gives the time difference in seconds.

and, to show in a nicer format, you can use:并且,为了以更好的格式显示,您可以使用:

    DecimalFormat myDecimalFormatter = new DecimalFormat("###,###.###");
    System.out.println(myDecimalFormatter.format(((double)d2.getTime()-d1.getTime())/1000));

Besides the most common approach with Period and Duration objects you can widen your knowledge with another way for dealing with time in Java.除了使用 Period 和 Duration 对象的最常见方法之外,您还可以通过另一种在 Java 中处理时间的方法来扩展您的知识。

Advanced Java 8 libraries.高级 Java 8 库。 ChronoUnit for Differences. ChronoUnit for Differences。

ChronoUnit is a great way to determine how far apart two Temporal values are. ChronoUnit 是确定两个时间值相距多远的好方法。 Temporal includes LocalDate , LocalTime and so on. Temporal 包括LocalDateLocalTime等。

LocalTime one = LocalTime.of(5,15);
LocalTime two = LocalTime.of(6,30);
LocalDate date = LocalDate.of(2019, 1, 29);

System.out.println(ChronoUnit.HOURS.between(one, two)); //1
System.out.println(ChronoUnit.MINUTES.between(one, two)); //75
System.out.println(ChronoUnit.MINUTES.between(one, date)); //DateTimeException

First example shows that between truncates rather than rounds.第一个示例显示截断之间而不是舍入。

The second shows how easy it is to count different units.第二个显示了计算不同单位是多么容易。

And the last example reminds us that we should not mess up with dates and times in Java:)最后一个例子提醒我们不要搞乱 Java 中的日期和时间:)

I found this cleaner.我发现这个更干净。

Date start = new Date();

//Waiting for 10 seconds
Thread.sleep(10000);

Date end = new Date();
long diff = end.getTime() - start.getTime();
String TimeTaken = String.format("[%s] hours : [%s] mins : [%s] secs",
                                 Long.toString(TimeUnit.MILLISECONDS.toHours(diff)),
                                 TimeUnit.MILLISECONDS.toMinutes(diff),
                                 TimeUnit.MILLISECONDS.toSeconds(diff));
System.out.println(String.format("Time taken %s", TimeTaken));

Output输出

Time taken [0] hours : [0] mins : [10] secs
public class timeDifference {

    public static void main(String[] args) {

        try {
            Date startTime = Calendar.getInstance().getTime();
            Thread.sleep(10000);
            Date endTime = Calendar.getInstance().getTime();

            long difference = endTime.getTime() - startTime.getTime();

            long differenceSeconds = difference / 1000 % 60;
            long differenceMinutes = difference / (60 * 1000) % 60;
            long differenceHours = difference / (60 * 60 * 1000) % 24;
            long differenceDays = difference / (24 * 60 * 60 * 1000);

            System.out.println(differenceDays + " days, ");
            System.out.println(differenceHours + " hours, ");
            System.out.println(differenceMinutes + " minutes, ");
            System.out.println(differenceSeconds + " seconds.");
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}
String start = "12:00:00";
String end = "02:05:00";

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); 

Date date1 = format.parse(start);

Date date2 = format.parse(end);

long difference = date2.getTime() - date1.getTime(); 

int minutes = (int) TimeUnit.MILLISECONDS.toMinutes(difference);

if(minutes<0)minutes += 1440; 

Now minutes will be the correct duration between two time (in minute).现在分钟将是两个时间之间的正确持续时间(以分钟为单位)。

import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {

    public static void main(String[] args) throws Exception {
        String time1 = "12:00:00";
        String time2 = "12:01:00";
        SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
        Date date1 = format.parse(time1);
        Date date2 = format.parse(time2);
        long difference = date2.getTime() - date1.getTime();
        System.out.println(difference/1000);
    }
}

It throws exception handles parsing exceptions.它抛出异常句柄解析异常。

The painful way is to convert to millis and do the subtraction and then back to whatever seconds or so you want.痛苦的方法是转换为毫秒并进行减法,然后返回到您想要的任何秒左右。 The better way is to use JodaTime .更好的方法是使用JodaTime

This can be easily done using Java 8 LocalTime;这可以使用 Java 8 LocalTime 轻松完成;

String time1 = "16:00:00";
String time2 = "19:00:00";

long seconds = Duration.between(LocalTime.parse(time1), LocalTime.parse(time2)).getSeconds()

Duration also supports toMillis(), toMinutes() which can be used in place of getSeconds() to get milliseconds or minutes Duration 还支持 toMillis(), toMinutes() 可以用来代替 getSeconds() 来获取毫秒或分钟

Аlternative option if time from different days is taken, for example: 22:00 and 01:55. -如果采用不同日期的时间,则为备选选项,例如:22:00 和 01:55。

public static long getDiffTime(Date date1, Date date2){
        if (date2.getTime() - date1.getTime() < 0) {// if for example date1 = 22:00, date2 = 01:55.
            Calendar c = Calendar.getInstance();
            c.setTime(date2);
            c.add(Calendar.DATE, 1);
            date2 = c.getTime();
        } //else for example date1 = 01:55, date2 = 03:55.
        long ms = date2.getTime() - date1.getTime();

        //235 minutes ~ 4 hours for (22:00 -- 01:55).
        //120 minutes ~ 2 hours for (01:55 -- 03:55).
        return TimeUnit.MINUTES.convert(ms, TimeUnit.MILLISECONDS);
    }

Try this:试试这个:

public String timeDifference8(String startTime, String endTime) {
    LocalTime initialTime = LocalTime.parse(startTime);
    LocalTime finalTime =LocalTime.parse(endTime);
    StringJoiner joiner = new StringJoiner(":");
    long hours = initialTime.until( finalTime, ChronoUnit.HOURS);
    initialTime = initialTime.plusHours( hours );
    long minutes = initialTime.until(finalTime, ChronoUnit.MINUTES);
    initialTime = initialTime.plusMinutes( minutes );
    long seconds = initialTime.until( finalTime, ChronoUnit.SECONDS);
    joiner.add(String.valueOf(hours));
    joiner.add(String.valueOf(minutes));
    joiner.add(String.valueOf(seconds));
    return joiner.toString();
}
import java.sql.*;

class Time3 {

    public static void main(String args[]){ 
        String time1 = "01:03:23";
        String time2 = "02:32:00";
        long difference ;
        Time t1 = Time.valueOf(time1);
        Time t2 = Time.valueOf(time2);
        if(t2.getTime() >= t1.getTime()){
            difference = t2.getTime() - t1.getTime() -19800000;
        }
        else{
            difference = t1.getTime() - t2.getTime() -19800000;
        }

        java.sql.Time time = new java.sql.Time(difference); 
        System.out.println(time);
    } 

} 
    /*
 * Total time calculation.
 */
private void getTotalHours() {
    try {
        // TODO Auto-generated method stub
        if (tfTimeIn.getValue() != null && tfTimeOut.getValue() != null) {
            Long min1 = tfTimeOut.getMinutesValue();
            Long min2 = tfTimeIn.getMinutesValue();
            Long hr1 = tfTimeOut.getHoursValue();
            Long hr2 = tfTimeIn.getHoursValue();
            Long hrsTotal = new Long("0");
            Long minTotal = new Long("0");
            if ((hr2 - hr1) == 1) {
                hrsTotal = (long) 1;
                if (min1 != 0 && min2 == 0) {
                    minTotal = (long) 60 - min1;
                } else if (min1 == 0 && min2 != 0) {
                    minTotal = min2;
                } else if (min1 != 0 && min2 != 0) {
                    minTotal = min2;
                    Long minOne = (long) 60 - min1;
                    Long minTwo = min2;
                    minTotal = minOne + minTwo;
                }
                if (minTotal >= 60) {
                    hrsTotal++;
                    minTotal = minTotal % 60;
                }
            } else if ((hr2 - hr1) > 0) {
                hrsTotal = (hr2 - hr1);
                if (min1 != 0 && min2 == 0) {
                    minTotal = (long) 60 - min1;
                } else if (min1 == 0 && min2 != 0) {
                    minTotal = min2;
                } else if (min1 != 0 && min2 != 0) {
                    minTotal = min2;
                    Long minOne = (long) 60 - min1;
                    Long minTwo = min2;
                    minTotal = minOne + minTwo;
                }
                if (minTotal >= 60) {
                    minTotal = minTotal % 60;
                }
            } else if ((hr2 - hr1) == 0) {
                if (min1 != 0 || min2 != 0) {
                    if (min2 > min1) {
                        hrsTotal = (long) 0;
                        minTotal = min2 - min1;
                    } else {
                        Notification.show("Enter A Valid Time");
                        tfTotalTime.setValue("00.00");
                    }
                }
            } else {
                Notification.show("Enter A Valid Time");
                tfTotalTime.setValue("00.00");
            }
            String hrsTotalString = hrsTotal.toString();
            String minTotalString = minTotal.toString();
            if (hrsTotalString.trim().length() == 1) {
                hrsTotalString = "0" + hrsTotalString;
            }
            if (minTotalString.trim().length() == 1) {
                minTotalString = "0" + minTotalString;
            }
            tfTotalTime.setValue(hrsTotalString + ":" + minTotalString);
        } else {
            tfTotalTime.setValue("00.00");
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}
class TimeCalculator
{
    String updateTime;

    public TimeCalculator(String time)
    {
        // Time should be in 24 hours format like 15/06/2016 17:39:20
        this.updateTime = time;
    }

    public String getTimeDifference()
    {
        String td = null;

        // Get Current Time
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
        Date currentDate = new Date();
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(currentDate);

        int c_year = calendar.get(Calendar.YEAR);
        int c_month = calendar.get(Calendar.MONTH) + 1;
        int c_day = calendar.get(Calendar.DAY_OF_MONTH);

        // Get Editing Time

        Date edit_date = sdf.parse(updateTime);
        Calendar edit_calendar = new GregorianCalendar();
        edit_calendar.setTime(edit_date);

        int e_year = edit_calendar.get(Calendar.YEAR);
        int e_month = edit_calendar.get(Calendar.MONTH) + 1;
        int e_day = edit_calendar.get(Calendar.DAY_OF_MONTH);

        if(e_year == c_year && e_month == c_month && e_day == c_day)
        {
            int c_hours = calendar.get(Calendar.HOUR_OF_DAY);
            int c_minutes = calendar.get(Calendar.MINUTE);
            int c_seconds = calendar.get(Calendar.SECOND);

            int e_hours = edit_calendar.get(Calendar.HOUR_OF_DAY);
            int e_minutes = edit_calendar.get(Calendar.MINUTE);
            int e_seconds = edit_calendar.get(Calendar.SECOND);

            if(c_hours == e_hours && c_minutes == e_minutes && c_seconds == e_seconds)
            {
                td = "just now";
                return td;
            }
            else if(c_hours == e_hours && c_minutes == e_minutes)
            {
                int d_seconds = c_seconds-e_seconds;
                td = String.valueOf(d_seconds);
                td = td + " seconds ago";
                return td;
            }
            else if(c_hours == e_hours && c_minutes != e_minutes)
            {
                int d_minutes = c_minutes-e_minutes;
                int d_seconds;
                if(c_seconds>e_seconds)
                {
                    d_seconds = c_seconds-e_seconds;
                }
                else
                {
                    d_seconds = e_seconds-c_seconds;
                }
                td = "00:" + String.valueOf(d_minutes) + ":" + String.valueOf(d_seconds) + " ago";
                return td;
            }
            else
            {
                int d_minutes, d_seconds, d_hours;
                d_hours = c_hours-e_hours;
                if(c_minutes>e_minutes)
                {
                    d_minutes = c_minutes - e_minutes;
                }
                else
                {
                    d_minutes = e_minutes - c_minutes;
                }
                if(c_seconds>e_seconds)
                {
                    d_seconds = c_seconds - e_seconds;
                }
                else
                {
                    d_seconds = e_seconds - c_seconds;
                }

                td = String.valueOf(d_hours) + ":" + String.valueOf(d_minutes) + ":" + String.valueOf(d_seconds) + " ago";
                return td;
            }
        }
        else if(e_year == c_year && e_month == c_month && c_day == e_day+1)
        {
            td = "yesterday";
            return td;
        }
        else
        {
            td = updateTime;
            return td;
        }
    }

}

using Instant使用 Instant

        Instant start = Instant.parse("2017-10-03T10:15:30.00Z");
        Instant end = Instant.parse("2017-10-04T11:35:31.00Z");

        long duration = Duration.between(start, end).toMillis();
        long minutes = TimeUnit.MILLISECONDS.toMinutes(duration)*60;
        String time = String.format("%02d hours, %02d min, %02d sec",
                TimeUnit.MILLISECONDS.toHours(duration),
                TimeUnit.MILLISECONDS.toMinutes(duration) -  TimeUnit.MILLISECONDS.toHours(duration) * 60,
                TimeUnit.MILLISECONDS.toSeconds(duration) - minutes);
                       ;
        System.out.println("time = " + time);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM