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 ! ^^ Gửi email bài đăng nàyBlogThis!Chia sẻ lên XChia sẻ lên Facebook Trang chủ
17 nhận xét:
- 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ờiTrả lời
- 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- Đặ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ờiTrả lời
- Unknownlúc 15:41 20 tháng 8, 2017
((year%4==0)&&(year%100!=100))||(year%400==0)
XóaTrả lờiTrả lời
Trả lời
- 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ờiTrả lời
- 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ờiTrả lời
- 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ờiTrả lời
- Unknownlúc 22:38 28 tháng 12, 2014
hay lắm
Trả lờiXóaTrả lờiTrả lời
- Unknownlúc 22:38 28 tháng 12, 2014
verry good
Trả lờiXóaTrả lờiTrả lời
- Unknownlúc 00:59 31 tháng 8, 2016
Thank!
Trả lờiXóaTrả lờiTrả lời
- 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- 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ờiTrả lời
Trả lời
- 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ờiTrả lời
- 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ờiTrả lời
- 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- 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ờiTrả lời
- 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ờiTrả lời
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
- AWS
- Bảo mật
- Blogger
- Drupal
- Git
- Html-CSS
- Internet
- java
- Joomla
- Laravel
- Linux
- MacOS
- My SQL
- Odoo
- Offices
- Openbravo ERP
- Openbravo POS
- Photoshop
- PHP-MySQL
- React Native
- Review code
- Solutions
- spring
- Tâm sự cuộc sống
- Truyện cười 18+
- Windows
- Wordpress
Đọ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
*