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 ! ^^ Bài đăng Mới hơn Bài đăng Cũ hơn Trang chủ

17 nhận xét:

  1. Minh bang chủlúc 15:37 28 tháng 10, 2011

    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óaTrả lời
      Trả lời
  2. ko biếtlúc 13:26 11 tháng 5, 2012

    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óaTrả lời
    1. Đặng Công Dưỡnglúc 16:02 9 tháng 11, 2016

      ví dụ như 1900, 2100 không được nhé

      XóaTrả lời
        Trả lời
    2. Unknownlúc 15:41 20 tháng 8, 2017

      ((year%4==0)&&(year%100!=100))||(year%400==0)

      XóaTrả lời
        Trả lời
    3. Trả lời
  3. ko biếtlúc 13:26 11 tháng 5, 2012

    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óaTrả lời
      Trả lời
  4. Minh bang chủlúc 17:40 12 tháng 5, 2012

    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óaTrả lời
      Trả lời
  5. Unknownlúc 10:15 23 tháng 7, 2014

    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óaTrả lời
      Trả lời
  6. Unknownlúc 22:38 28 tháng 12, 2014

    hay lắm

    Trả lờiXóaTrả lời
      Trả lời
  7. Unknownlúc 22:38 28 tháng 12, 2014

    verry good

    Trả lờiXóaTrả lời
      Trả lời
  8. Unknownlúc 00:59 31 tháng 8, 2016

    Thank!

    Trả lờiXóaTrả lời
      Trả lời
  9. Unknownlúc 09:40 19 tháng 12, 2016

    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=330ngayNế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óaTrả lời
    1. Unknownlúc 18:52 3 tháng 3, 2021

      k phải bài vd 2 đã làm rồi hay sao b

      XóaTrả lời
        Trả lời
    2. Trả lời
  10. Unknownlúc 11:30 28 tháng 12, 2017

    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óaTrả lời
      Trả lời
  11. TienAnhvnlúc 15:16 5 tháng 7, 2020

    chào mọi người đến với lập trình java cơ bản

    Trả lờiXóaTrả lời
      Trả lời
  12. Lãm Sóclúc 09:41 16 tháng 3, 2021

    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óaTrả lời
    1. Minh bang chủlúc 17:21 30 tháng 4, 2021

      Đây là công thức tính ra ms (Mili giây) nhé bạndays * 24 * 60 * 60 * 1000 = days * 86400000 ms

      XóaTrả lời
        Trả lời
    2. Unknownlúc 08:30 18 tháng 9, 2021

      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óaTrả lời
        Trả lời
    3. Trả lời
Thêm nhận xétTải thêm...

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

Search

Danh mục

Đọc nhiều

  • Tô màu nền hoặc hoặc lớp đối tượng trong Photoshop
  • Xem file .PSD dạng Thumbnail trong Windows
  • Bo tròn góc ảnh bằng Photoshop
  • Photoshop không save png được
  • Tạo bộ cài win 7, win 8 trên ổ cứng di động, USB

Facebook

Tác giả

Minh bang chủ Xem hồ sơ hoàn chỉnh của tôi

Bạn bè theo dõi

Nổi bật

Review code Laravel đẹp, chuẩn

Liên hệ với tôi

Tên Email * Thông báo *

Từ khóa » Tính Số Ngày Trong Tháng Java