วิธีคำนวณความแตกต่างของเวลาใน Java?


99

ฉันต้องการลบสองช่วงเวลาบอกว่า 16:00:00 น. จาก 19:00:00 น. มีฟังก์ชัน java สำหรับสิ่งนี้หรือไม่? ผลลัพธ์อาจอยู่ในหน่วยมิลลิวินาทีวินาทีหรือนาที


5
อาจเป็นjoda-time.sourceforge.net
stacker

คำตอบ:


118
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(); 

ความแตกต่างอยู่ในหน่วยมิลลิวินาที

ผมปรับเปลี่ยนsfaizs โพสต์


7
แล้วทางอื่นล่ะ? 16:00 - 19:00 น.? ฉันจะคำนวณสิ่งนี้ได้อย่างไร?
Alex Kapustian

การแปลงตัวแปรกลับไม่ได้ผลดีเท่าไหร่ .. ในตัวอย่างนี้แน่นอนว่าคุณสามารถกลับค่าและใช้ค่าสัมบูรณ์หรือค่าสัมบูรณ์ แต่จะเกิดอะไรขึ้นถ้าคุณมีเวลาเที่ยงคืน (00:00 น.)?
rj2700

1
เวลา 23:15:00 - 01:15:00 น.?
Oleksandr

อะไรคือความแตกต่างระหว่าง 08:00:00 ของวันนี้กับ 10:00:00 ของเมื่อวาน ??????? ฉันไม่คิดว่าสิ่งที่คุณแนะนำเป็นตรรกะที่แตกหักได้
channae

119

Java 8 มีโซลูชันที่สะอาดกว่า - ทันทีและระยะเวลา

ตัวอย่าง:

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");

ฉันชอบคำตอบของคุณมาก หรูหรามาก! :)
Avinash

ดังนั้นสิ่งนี้จึงลดลงเหลือสองการนำเข้าและSystem.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));เพื่อบันทึกระยะเวลา ฉันจะไม่เรียกสิ่งนั้นว่าเป็นโซลูชันที่ดีและสะอาดใน Java8 ถ้าภาษาอื่นสามารถทำได้ด้วยรหัสเช่นprint("Duration: " + str(time.time()-start))...
Luc

4
@Luc ความสะอาดไม่เหมือนกับความกะทัดรัด ชัดเจนกว่ามากว่าเกิดอะไรขึ้นในเวอร์ชัน Java 8 และยังง่ายกว่ามากที่จะปรับแต่งตัวอย่างเช่นหากคุณต้องการรายงานระยะเวลาระหว่างสองอินสแตนซ์ในหน่วยอื่นที่ไม่ใช่มิลลิวินาทีหรือเป็นหลายหน่วย (เช่น1h 15m 3.022sแทนที่จะเป็น4503022 milliseconds) .
JakeRobb

42

เพื่อให้ได้ความแตกต่างของเวลาที่ค่อนข้างชัดเจน

// 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.");

คำตอบที่ดีจริงๆ
Palanivelraghul

32

จาวา 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();

1
นี้ยังสามารถใช้ได้สำหรับ Java SE 6 และ 7 เป็นพอร์ตกลับมาเช่นเดียวกับสำหรับAndroid
Bryan

11

เช่นเดียวกับภาษาอื่น ๆ แปลงช่วงเวลาของคุณเป็นการประทับเวลา Unix (เช่นวินาทีนับตั้งแต่ยุค Unix) จากนั้นก็ลบออก จากนั้นวินาทีที่เกิดขึ้นควรใช้เป็นเวลาประทับของยูนิกซ์ใหม่และอ่านจัดรูปแบบในรูปแบบใดก็ได้ที่คุณต้องการ

อ๊ะให้โปสเตอร์ด้านบน (ยีนส์) เครดิตที่ครบกำหนดของเขารหัสมักจะมีประโยชน์;) แต่ตอนนี้คุณมีคำอธิบายเช่นกัน :)


8
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.

และหากต้องการแสดงในรูปแบบที่ดีกว่าคุณสามารถใช้:

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

คำตอบนี้ซ้ำกันและไม่เพิ่มเนื้อหาใหม่ โปรดอย่าโพสต์คำตอบเว้นแต่คุณจะมีสิ่งใหม่ ๆ ที่จะร่วมให้ข้อมูล
DavidPostill

@DavidPostill ขอบคุณสำหรับหัว แต่วิธีแก้ปัญหาที่ฉันต้องการด้วยตัวเองและไม่พบในโพสต์ของ GENESIS คือความแตกต่างของเวลาระหว่างการเรียกใช้โค้ดสองบรรทัด (เช่นจุดเริ่มต้นและจุดสิ้นสุดของโปรแกรมหรือก่อนและหลังเรียกใช้เมธอดไม่ใช่เวลาคงที่) . ฉันคิดว่านี่อาจช่วยได้
Alisa

3

นอกเหนือจากแนวทางที่พบบ่อยที่สุดกับวัตถุระยะเวลาและระยะเวลาคุณยังสามารถเพิ่มพูนความรู้ของคุณด้วยวิธีอื่นในการจัดการกับเวลาใน Java

ไลบรารี Java 8 ขั้นสูง ChronoUnitสำหรับความแตกต่าง

ChronoUnit เป็นวิธีที่ยอดเยี่ยมในการพิจารณาว่าค่า Temporal สองค่าอยู่ห่างกันเพียงใด Temporal รวมถึงLocalDate , LocalTimeและอื่น ๆ

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

ตัวอย่างแรกแสดงให้เห็นว่าระหว่างการตัดทอนแทนที่จะเป็นรอบ

ข้อที่สองแสดงให้เห็นว่าการนับหน่วยต่างๆทำได้ง่ายเพียงใด

และตัวอย่างสุดท้ายเตือนเราว่าเราไม่ควรยุ่งกับวันที่และเวลาใน Java :)


2

วิธีที่เจ็บปวดคือการแปลงเป็นมิลลิวินาทีและทำการลบแล้วกลับไปเป็นวินาทีใดก็ได้ที่คุณต้องการ วิธีที่ดีคือการใช้JodaTime


1
ฉันไม่เคยพูดถึงการประทับเวลาของยูนิกซ์ นอกจากนี้ยังเป็นที่ทราบกันดีว่า Java Date and Time API นั้นใช้งานได้นานกว่าการใช้งานในบางครั้ง JodaTime ดีกว่ามากและอาจเป็นวิธีที่จะไปจนกว่า JSR 310 จะเป็นส่วนหนึ่งของ Java sourceforge.net/apps/mediawiki/threeten/…
Manfred Moser

@ Manfred Moser: คุณควรมี ... ทั้งคลาสเวลาเริ่มต้นของ Java และ Joda ให้เวลาเป็นมิลลิวินาทีซึ่งเริ่มต้นจากสิ่งที่เรียกว่ายุคUnix เมื่อมาถึงจุดนี้พวกเขากลายเป็นสิ่งที่ใกล้เคียงกับการประทับเวลาของUnix (อันหนึ่งมีหน่วยเป็นมิลลิวินาทีอีกอันหนึ่งเป็นวินาที) ไม่ว่าในกรณีใดสิ่งที่ OP ต้องการสามารถทำได้เล็กน้อยโดยใช้คลาส Java เริ่มต้นโดยใช้จำนวนมิลลิวินาทีตั้งแต่ยุคUnixและแทนที่พวกเขา
SyntaxT3rr0r

1
แน่นอนว่าสามารถทำได้เล็กน้อย และหากคุณคำนวณวันที่และเวลาจำนวนมากในแอปของคุณคุณยังสามารถสร้างจุดบกพร่องมากมายด้วยตัวคุณเองและสร้างห้องสมุดเล็ก ๆ ของคุณขึ้นมาใหม่โดยใช้ส่วนต่างๆของ JodaTime ด้วยตัวคุณเองอีกครั้ง สำหรับการคำนวณง่ายๆเพียงอย่างเดียวที่อาจจะใช้ได้ แต่สำหรับการใช้งานบ่อยๆควรใช้ไลบรารีที่เหมาะสม ฉันแค่พยายามชี้ให้เห็นว่าวิธีแก้ปัญหาง่ายๆข้อแรกอาจไม่ได้นำคุณไปสู่เส้นทางที่ดีที่สุด มีอะไรผิดปกติ?
Manfred Moser

3
@ Manfred Moser: อันที่จริงวิธีแก้ปัญหาง่ายๆอย่างแรกคือเส้นทางที่ถูกต้องเมื่อพิจารณาจาก OP ขอความแตกต่างระหว่างสองช่วงเวลาไม่ใช่การเปลี่ยนแปลงของนาฬิกาอะตอม :)
Christian

แน่นอน .. สำหรับตัวอย่างนี้และคำถามเฉพาะเท่านั้น ไม่ใช่สำหรับภาพที่ใหญ่กว่า
Manfred Moser

2
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; 

ตอนนี้นาทีจะเป็นช่วงเวลาที่ถูกต้องระหว่างสองเวลา (เป็นนาที)


2
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();
    }
}

}


2
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);
}}

การพ่นข้อยกเว้นจะจัดการกับการแยกวิเคราะห์ข้อยกเว้น


1

Аทางเลือกอื่นหากใช้เวลาจากวันที่ต่างกันตัวอย่างเช่น 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);
    }

1

ลองสิ่งนี้:

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();
}

1
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);
    } 

} 

1

เจอแบบนี้สะอาดกว่า

       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));

เอาท์พุท : เวลาที่ถ่าย [0] ชั่วโมง: [0] นาที: [10] วินาที


0
    /*
 * 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();
    }
}

2
แม้ว่ารหัสนี้อาจตอบคำถาม แต่การให้บริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีที่รหัสนี้ตอบคำถามช่วยเพิ่มมูลค่าในระยะยาว
Benjamin W.

0

คลาส 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;
     }
}}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.