Làm thế nào để tính toán chênh lệch múi giờ trong java?


Câu trả lời:


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

Sự khác biệt tính bằng mili giây.

Tôi đã sửa đổi bài đăng của sfaizs .


7
còn cách khác thì sao? 16:00 - 19:00? Làm thế nào tôi có thể tính toán điều này?
Alex Kapustian

Đảo ngược các biến sẽ không tốt lắm .. Trong ví dụ này, chắc chắn, bạn có thể đảo ngược chúng và lấy giá trị tuyệt đối hoặc một cái gì đó. Nhưng điều gì sẽ xảy ra nếu bạn có nửa đêm (00:00)?
rj2700

23:15:00 - 01:15:00 thì sao?
Oleksandr

Còn sự khác biệt giữa 08:00:00 hôm nay và 10:00:00 ngày hôm qua thì sao ??????? Tôi không nghĩ những gì bạn đề xuất là một logic có thể phá vỡ.
channae

104

Java 8 có một giải pháp gọn gàng hơn - Tức thì và Thời lượng

Thí dụ:

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

Tôi thực sự thích câu trả lời của bạn. Rất thanh lịch! :)
Avinash

Vì vậy, điều này tổng hợp thành hai lần nhập và System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));ghi lại thời lượng. Tôi sẽ không gọi đó là một giải pháp tốt đẹp và sạch trong Java8 nếu ngôn ngữ khác có thể làm điều đó với mã như thế print("Duration: " + str(time.time()-start))...
Lục

3
@Luc sạch sẽ không giống như ngắn gọn. Nó rõ ràng hơn chính xác những gì đang xảy ra trong phiên bản Java 8 và cũng dễ dàng hơn nhiều để điều chỉnh nếu, ví dụ, bạn muốn báo cáo thời lượng giữa hai phiên bản trong một đơn vị khác mili giây hoặc nhiều đơn vị (ví dụ: 1h 15m 3.022sthay vì 4503022 milliseconds) .
JakeRobb

39

ĐỂ có được sự khác biệt khá lớn về thời gian, sau đó

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

thực sự câu trả lời tuyệt vời
Palanivelraghul

32

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

1
Điều này cũng có sẵn cho Java SE 6 và 7 như một cổng sau , cũng như cho Android .
Bryan

11

Cũng giống như bất kỳ ngôn ngữ nào khác; chuyển đổi khoảng thời gian của bạn thành dấu thời gian unix (tức là giây kể từ kỷ nguyên Unix) và sau đó chỉ cần trừ đi. Sau đó, các giây kết quả sẽ được sử dụng làm dấu thời gian unix mới và được định dạng đọc ở bất kỳ định dạng nào bạn muốn.

À, hãy đưa cho người đăng ở trên (geneiss) tín dụng đến hạn của anh ấy, mã luôn tiện dụng;) Tuy nhiên, bây giờ bạn cũng có lời giải thích :)


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.

và, để hiển thị ở định dạng đẹp hơn, bạn có thể sử dụng:

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

Câu trả lời này trùng lặp với một câu trả lời khác và không thêm nội dung mới. Vui lòng không đăng câu trả lời trừ khi bạn thực sự có điều gì đó mới để đóng góp.
DavidPostill

@DavidPostill, cảm ơn bạn đã quan tâm. Nhưng giải pháp mà bản thân tôi cần và không tìm thấy trong bài đăng của GENESIS là chênh lệch thời gian giữa việc thực thi hai dòng mã (như điểm bắt đầu và điểm kết thúc của chương trình hoặc trước và sau khi chạy một phương thức, không phải một số thời gian tĩnh) . Tôi nghĩ điều này có thể hữu ích.
Alisa

2

Cách khó khăn là chuyển đổi sang mili và thực hiện phép trừ và sau đó quay lại bất kỳ giây nào bạn muốn. Cách tốt hơn là sử dụng JodaTime .


1
Tôi chưa bao giờ đề cập đến dấu thời gian unix. Ngoài ra, một thực tế nổi tiếng là API Ngày và Giờ của Java hấp dẫn hơn là sử dụng thông thường. JodaTime tốt hơn nhiều và có lẽ là cách để tiếp tục cho đến khi JSR 310 là một phần của Java. sourceforge.net/apps/mediawiki/threeten/…
Manfred Moser

@Manfred Moser: bạn có thể nên có ... Cả hai lớp thời gian Java mặc định và Joda đều đưa ra thời gian tính bằng mili giây bắt đầu từ cái được gọi là kỷ nguyên Unix . Tại thời điểm này, chúng trở nên gần giống với dấu thời gian Unix (một tính bằng mili, còn lại tính bằng giây). Trong mọi trường hợp, những gì OP muốn có thể được thực hiện một cách nhẹ nhàng bằng cách sử dụng các lớp Java mặc định, lấy số mili kể từ kỷ nguyên Unix và trừ chúng.
Cú phápT3rr0r

1
Chắc chắn nó có thể được thực hiện một cách nhẹ nhàng. Và nếu bạn thực hiện nhiều phép tính ngày và giờ trong ứng dụng của mình, bạn cũng có thể tự tạo ra rất nhiều lỗi và tự mình phát minh lại thư viện nhỏ của mình để tự triển khai lại các phần của JodaTime. Đối với một phép tính đơn giản có thể ổn nhưng để sử dụng thường xuyên, bạn nên sử dụng một thư viện phù hợp. Tôi chỉ đang cố gắng chỉ ra rằng giải pháp đơn giản đầu tiên có thể không dẫn bạn đến con đường tốt nhất. Có gì sai với điều đó?
Manfred Moser

3
@Manfred Moser: Trên thực tế, giải pháp đơn giản đầu tiên con đường đúng đắn, xem xét OP yêu cầu sự khác biệt giữa hai khoảng thời gian, chứ không phải những thay đổi trong đồng hồ nguyên tử :)
Christian

Chắc chắn .. chỉ cho ví dụ này và câu hỏi cụ thể. Tuy nhiên, không phải cho bức tranh lớn hơn.
Manfred Moser

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

ném các xử lý ngoại lệ phân tích cú pháp ngoại lệ


2

Bên cạnh cách tiếp cận phổ biến nhất với các đối tượng Khoảng thời gian và Khoảng thời gian, bạn có thể mở rộng kiến ​​thức của mình với một cách khác để xử lý thời gian trong Java.

Các thư viện Java 8 nâng cao. ChronoUnit cho sự khác biệt.

ChronoUnit là một cách tuyệt vời để xác định khoảng cách giữa hai giá trị Thời gian. Thời gian bao gồm LOCALDATE , localtime và vân vân.

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

Ví dụ đầu tiên cho thấy rằng giữa các đường cắt ngắn hơn là các vòng.

Thứ hai cho thấy việc đếm các đơn vị khác nhau dễ dàng như thế nào.

Và ví dụ cuối cùng nhắc nhở chúng ta rằng chúng ta không nên nhầm lẫn ngày và giờ trong Java :)


1

Tùy chọn Аlternative nếu lấy thời gian từ các ngày khác nhau, ví dụ: 22:00 và 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
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; 

Bây giờ phút sẽ là khoảng thời gian chính xác giữa hai thời gian (tính bằng phút).


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

}


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

Tôi thấy điều này sạch hơn.

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

Đầu ra : Thời gian thực hiện [0] giờ: [0] phút: [10] giây


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
Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh liên quan đến lý do và / hoặc cách mã này trả lời câu hỏi sẽ cải thiện giá trị lâu dài của nó.
Benjamin W.

0

lớp 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;
     }
}}

0

Thử cái này:

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();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.