Tổng hợp các phương thức xử lý thời gian trong java

Hôm nay rảnh rỗi phát triển một số tính năng cho Openbravo POS  có liên quan tới xử lý thời gian, ví dụ : Tính năng cho phép người dùng thiết lập tự động một chương trình khuyến mãi theo thời gian từ ngày nào đến nào và có thể chọn cho 1 khoảng thời gian nào đó trong ngày (Giờ vàng - Happy Hour) . Tự dưng đang làm đụng phải vấn đề xử lý thời gian ví dụ như : Muốn biết khoảng cách giữa 2 ngày, so sánh 2 khoảng thời gian , cộng trừ 2 khoảng thời gian ... ==> Sau một hồi lượm lặt từ Internet , mấy cuốn bí kíp ... tôi lưu lại một số phương thức sau phòng khi dùng lại cho nhanh và cũng muốn share cho những ai chưa biết

1. Tăng hoặc giảm ngày, tháng, năm (lên / xuống) một đơn vị thời gian cho một mốc thời gian.

 Để làm điều này bạn sử dụng 2 phương thức roll() hoặc add() . Tôi không muốn giải thích nhiều ^^ vì bạn có thể tham khảo điều đó tại đây , nhưng đoạn code ví dụ sẽ giúp bạn thấy rõ cách dùng .
 Tôi muốn nói một chút về sự khác nhau giữa 2 phương thức này.
- Đối với phương thức roll() : làm thay đổi (Tăng / giảm) một đối tượng calendar cụ thể và không thay đổi đối tượng calendar lớn hơn (Đối tượng Calendar.MONTH được coi là lớn hơn Calendar.DATE, Calendar.YEAR lớn hơn Calendar.MONTH). Ví dụ: Bạn muốn thay đổi ngày trong mốc thời gian ("31-07-2011") thêm 8 ngày nữa ==> Bạn sử dụng roll() : roll(Calendar.DATE, 8) ; ==> Kết quả thu được sẽ là ("08-07-2011") .

- Đối với phương thức add(): làm thay đổi (Tăng / giảm) một đối tượng calendar cụ thể đồng thời làm thay đổi đối tượng calendar lớn hơn . Ví dụ : Đối với mốc thời gian ("31-07-2011") ở ví dụ trên, nếu dùng add():
add(Calendar.DATE, 8) ; ==> Kết quả thu được sẽ là ("08-08-2011") .

Source code ví dụ:
public static void UpDownDate() {

        // Định dạng thời gian
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");

        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();

        // Định nghĩa mốc thời gian ban đầu là ngày 31-07-2011

        Date date = Date.valueOf("2011-07-31");

        c1.setTime(date);
        c2.setTime(date);

        System.out.println("Ngày ban đầu : " + dateFormat.format(c1.getTime()));

        // Tăng ngày thêm 8 ngày -- Sử dụng phương thức roll()
        c1.roll(Calendar.DATE, 8);

        // c1.roll(Calendar.DATE, -8); // Giảm ngày 8 ngày ==> 23-07-2011
        System.out.println("Ngày được tăng thêm 8 ngày (Sử dụng Roll) : "+ dateFormat.format(c1.getTime()));

       
        /* Các trường hợp khác
        c1.roll(Calendar.DATE, true); //Tăng 1 ngày -- Nếu muốn giảm một ngày truyền vào false
        c1.roll(Calendar.MONTH, 2);   //Tăng lên 2 tháng
        c1.roll(Calendar.YEAR, 2) ;      //Tăng lên 2 năm
        */

        // Tăng ngày thêm 8 ngày -- Sử dụng phương thức add()
        c2.add(Calendar.DATE, 8);
        //c2.add(Calendar.DATE, -8); // Giảm ngày 8 ngày ==> 23-07-2011
        System.out.println("Ngày được tăng thêm 8 ngày (Sử dụng add)  : "
                + dateFormat.format(c2.getTime()));

        /* Các trường hợp khác :
        c2.add(Calendar.MONTH, 2);   //Tăng lên 2 tháng
        c2.add(Calendar.YEAR, 2) ;      //Tăng lên 2 năm
        */

    }
2. Khoảng cách giữa 2 ngày ( Đếm số ngày giữa 2 mốc thời gian).
public static void daysBetween2Dates() {
        // Định dạng thời gian
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");

        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();

        // Định nghĩa 2 mốc thời gian ban đầu
        Date date1 = Date.valueOf("2011-06-15");
        Date date2 = Date.valueOf("2011-07-30");

        c1.setTime(date1);
        c2.setTime(date2);

        // Công thức tính số ngày giữa 2 mốc thời gian:
        long noDay = (c2.getTime().getTime() - c1.getTime().getTime()) / (24 * 3600 * 1000);

        System.out.print("Số ngày giữa " + dateFormat.format(c1.getTime())

                + " và " + dateFormat.format(c2.getTime()) + ": ");

        System.out.println(noDay);

    }
 3. So sánh 2 mốc thời gian (So sánh 2 ngày)
    public static void compareDate(){

        // Định nghĩa 2 mốc thời gian ban đầu
        Date date1 = Date.valueOf("2011-06-15");
        Date date2 = Date.valueOf("2011-07-30");
        
        String relation;
        if (date1.equals(date2))
          relation = "Hai ngày trùng nhau";
        else if (date1.before(date2)) // Hoặc  else if (date1.after(date2)== false)
          relation = " Trước";
        else
          relation = " Sau";
        System.out.println(date1 + relation + ' ' + date2);

    }
4. Kiểm tra một chuỗi có phải là một ngày hay không
 public boolean isValidDate(String inDate) {

        if (inDate == null)
          return false;

        //set the format to use as a constructor argument
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        if (inDate.trim().length() != dateFormat.toPattern().length())
          return false;

        dateFormat.setLenient(false);

        try {
          //parse the inDate parameter
          dateFormat.parse(inDate.trim());
        }

        catch (ParseException pe) {
          return false;
        }

        return true;

      }
 5. Kiểm tra có phải năm nhuận hay không?
    public static boolean isLeapYear(int year) {
        if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) {

            return true;

        }

        return false;

    }
 6. Đếm số ngày trong một tháng.
    public static void daysInMonth() {

        TimeInJava tij = new TimeInJava();

        Calendar c1 = Calendar.getInstance();
        c1.set(2008, 6 , 20);

        int year = c1.get(Calendar.YEAR);
        int month = c1.get(Calendar.MONTH);

//      int days = c1.get(Calendar.DATE);

        int [] daysInMonths = {31,28,31,30,31,30,31,31,30,31,30,31};

        daysInMonths[1] += tij.isLeapYear(year) ? 1 : 0;  // Sử dụng phương thức kiểm tra năm nhuần ở trên

        System.out.println("Số ngày trong tháng "+month+" năm "+year+" : "+ daysInMonths[c1.get(Calendar.MONTH)]);
    }
7. So sánh giờ hiện tại có nằm trong khoảng giờ nào đó trong này hay không .
 Ví dụ : 10:20 có nằm trong khoảng 10:00 đến 10:40 hay không? :

//Phương thức xác định xem giờ hiện tại có thuộc vào một khoảng giờ nào đó hay không

public static boolean isInHappyHour(String startHour, String endHour) throws ParseException {

    boolean result = false;

    SimpleDateFormat hourFormat = new SimpleDateFormat("HH:mm");

    Date start = hourFormat.parse(startHour);
    Date end = hourFormat.parse(endHour);
    Date now = new Date(System.currentTimeMillis());

    String nowHourStr = hourFormat.format(now.getTime());

    try {
        Date nowHour = hourFormat.parse(nowHourStr);
        if (nowHour.after(start) && nowHour.before(end) || (nowHour.equals(start) || (nowHour.equals(end)))) {
            result = true;
        }

    } catch (ParseException e) {
        result = false;
    }

    return result;

} 

8. Xác định giữa 2 khoảng thời gian có bao nhiêu giờ, bao nhiêu phút, bao nhiêu giây:

    public static void main(String[] args) {

        String dateStart = "2012-03-14 09:33:58";

        String dateStop = "2012-03-14 10:34:59";

        // Custom date format

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Date d1 = null;

        Date d2 = null;

        try {

            d1 = format.parse(dateStart);

            d2 = format.parse(dateStop);

        } catch (ParseException e) {

        }

        // Get msec from each, and subtract.

        long diff = d2.getTime() - d1.getTime();

        long diffSeconds = diff / 1000;

        long diffMinutes = diff / (60 * 1000);

        long diffHours = diff / (60 * 60 * 1000);

        System.out.println("Số giây : " + diffSeconds + " seconds.");

        System.out.println("Số phút: " + diffMinutes + " minutes.");

        System.out.println("Số giờ: " + diffHours + " hours.");

    }
==> Tạm thời share chừng này đã, khi nào có thời gian hoặc gặp thêm vấn đề tôi viết tiếp vậy ! ^^

17 nhận xét:

  1. Add thêm phương thức so sánh giờ hiện tại có nằm trong khoảng giờ nào đó trong này hay không . Ví dụ : 10:20 có nằm trong khoảng 10:00 đến 10:40 hay không? :

    //Phương thức xác định xem giờ hiện tại có thuộc vào một khoảng giờ nào đó hay không
    public static boolean isInHappyHour(String startHour, String endHour) throws ParseException {
    boolean result = false;
    SimpleDateFormat hourFormat = new SimpleDateFormat("HH:mm");
    Date start = hourFormat.parse(startHour);
    Date end = hourFormat.parse(endHour);

    Date now = new Date(System.currentTimeMillis());

    String nowHourStr = hourFormat.format(now.getTime());

    try {
    Date nowHour = hourFormat.parse(nowHourStr);
    if (nowHour.after(start) && nowHour.before(end) || (nowHour.equals(start) || (nowHour.equals(end)))) {
    result = true;
    }
    } catch (ParseException e) {
    result = false;
    }
    return result;
    }

    Trả lờiXóa
  2. Phương thức này bị sai rồi nhé bạn !

    public static boolean isLeapYear(int year) {
    if ((year % 100 != 0) || (year % 400 == 0)) {
    return true;
    }
    return false;
    }

    Trả lờiXóa
  3. Xin sửa lại như sau :
    public static boolean isLeapYear(int year) {
    if ((year % 100 != 0) && (year % 400 == 0)) {
    return true;
    }
    return false;
    }

    Trả lờiXóa
  4. Cảm ơn bạn rất nhiều nhé! ^_^, Mình đã test lại cả mình và bạn đều làm chưa đúng. Bạn lưu ý nhé. Mình đã cập nhật lại phương thức đúng nhất ở trên nhé.

    Trả lờiXóa
  5. Các bạn giúp mình với. Đề tài là làm 1 button để bắt đầu thời gian và một button kết thúc thời gian rồi tính khoảng thời gian đó.

    Trả lờiXóa
  6. Mình muốn tính số ngày từ năm này tới năm kia thì làm như thế nào ạ!

    Ví dụ: 7/2015 - 6/2016= 11thang=330ngay
    Nếu như (so ngay<365 là 0.5 năm)và =365 ngay là 1 năm. Cứ thế tăng lên.

    Trả lờiXóa
  7. Hi, moi người có biết cách tính ra số tháng không ạ? ví dụ 2-7-2015 đến new date()

    Trả lờiXóa
  8. Ad có thể giải thích cho em dòng này được không ạ:
    long noDay = (c2.getTime().getTime() - c1.getTime().getTime())/(24*3600*1000);
    Vì sao nó lại có những con số như vậy ạ?
    Tks ad nhiều.

    Trả lờiXóa
    Trả lời
    1. Đây là công thức tính ra ms (Mili giây) nhé bạn
      days * 24 * 60 * 60 * 1000 = days * 86400000 ms

      Xóa
    2. so sánh ngày nhập vào với ngày hiện tại ở máy tính thì làm sao ạ

      Xóa

Rất mong các ý kiến của các bạn khi đọc bài viết này !