Làm cách nào để thêm n giờ vào đối tượng Date? Tôi đã tìm thấy một ví dụ khác sử dụng ngày trên StackOverflow, nhưng vẫn không hiểu cách thực hiện với hàng giờ.
Làm cách nào để thêm n giờ vào đối tượng Date? Tôi đã tìm thấy một ví dụ khác sử dụng ngày trên StackOverflow, nhưng vẫn không hiểu cách thực hiện với hàng giờ.
Câu trả lời:
Kiểm tra lớp Lịch. Nó có add
phương thức (và một số khác) để cho phép thao tác thời gian. Một cái gì đó như thế này sẽ làm việc.
Calendar cal = Calendar.getInstance(); // creates calendar
cal.setTime(new Date()); // sets calendar time/date
cal.add(Calendar.HOUR_OF_DAY, 1); // adds one hour
cal.getTime(); // returns new date object, one hour in the future
Kiểm tra API để biết thêm.
Calendar.add()
sẽ tự động chăm sóc điều đó.
java.util.Date
, java.util.Calendar
và java.text.SimpleDateFormat
hiện đang là di sản , được thay thế bởi các lớp java.time được tích hợp trong Java 8 & Java 9. Xem Hướng dẫn của Oracle .
Nếu bạn sử dụng Apache Commons / Lang , bạn có thể thực hiện điều đó trong một bước bằng cách sử dụng DateUtils.addHours()
:
Date newDate = DateUtils.addHours(oldDate, 3);
(Đối tượng ban đầu không thay đổi)
DateUtils.addHours(oldDate, -1);
Để đơn giản hóa ví dụ của @ Christopher.
Nói rằng bạn có một hằng số
public static final long HOUR = 3600*1000; // in milli-seconds.
Bạn có thể viết.
Date newDate = new Date(oldDate.getTime() + 2 * HOUR);
Nếu bạn sử dụng lâu để lưu trữ ngày / giờ thay vì đối tượng Ngày, bạn có thể làm
long newDate = oldDate + 2 * HOUR;
myJavaUtilDate.toInstant()
.plusHours( 8 )
Hoặc là…
myJavaUtilDate.toInstant() // Convert from legacy class to modern class, an `Instant`, a point on the timeline in UTC with resolution of nanoseconds.
.plus( // Do the math, adding a span of time to our moment, our `Instant`.
Duration.ofHours( 8 ) // Specify a span of time unattached to the timeline.
) // Returns another `Instant`. Using immutable objects creates a new instance while leaving the original intact.
Khung công tác java.time được tích hợp vào Java 8 và sau đó thay thế các lớp Java.util.Date/.CalWiki cũ. Những lớp học cũ nổi tiếng là rắc rối. Tránh chúng.
Sử dụng toInstant
phương thức mới được thêm vào java.util.Date để chuyển đổi từ loại cũ sang loại java.time mới. An Instant
là một khoảnh khắc trên dòng thời gian trong UTC với độ phân giải nano giây .
Instant instant = myUtilDate.toInstant();
Bạn có thể thêm giờ vào đó Instant
bằng cách vượt qua TemporalAmount
như Duration
.
Duration duration = Duration.ofHours( 8 );
Instant instantHourLater = instant.plus( duration );
Để đọc thời gian đó, hãy tạo Chuỗi theo định dạng ISO 8601 tiêu chuẩn bằng cách gọi toString
.
String output = instantHourLater.toString();
Bạn có thể muốn nhìn thấy khoảnh khắc đó qua lăng kính của đồng hồ treo tường của một số khu vực . Điều chỉnh Instant
vào múi giờ mong muốn / mong muốn của bạn bằng cách tạo một ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Ngoài ra, bạn có thể gọi plusHours
để thêm số giờ của bạn. Được khoanh vùng có nghĩa là Giờ tiết kiệm ánh sáng ban ngày (DST) và các bất thường khác sẽ được xử lý thay cho bạn.
ZonedDateTime later = zdt.plusHours( 8 );
Bạn nên tránh sử dụng các lớp thời gian cũ bao gồm java.util.Date
và .Calendar
. Nhưng nếu bạn thực sự cần một java.util.Date
khả năng tương tác với các lớp chưa được cập nhật cho các loại java.time, hãy chuyển đổi từ ZonedDateTime
qua Instant
. Các phương thức mới được thêm vào các lớp cũ tạo điều kiện chuyển đổi sang / từ các loại java.time.
java.util.Date date = java.util.Date.from( later.toInstant() );
Để thảo luận thêm về chuyển đổi, hãy xem Câu trả lời của tôi cho Câu hỏi, Chuyển đổi java.util.Date sang loại java java.time nào? .
Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date
, Calendar
, & SimpleDateFormat
.
Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.
Để tìm hiểu thêm, xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .
Bạn có thể trao đổi các đối tượng java.time trực tiếp với cơ sở dữ liệu của bạn. Sử dụng trình điều khiển JDBC tương thích với JDBC 4.2 trở lên. Không cần chuỗi, không cần java.sql.*
lớp.
Nơi để có được các lớp java.time?
Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho các bổ sung có thể trong tương lai cho java.time. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval
, YearWeek
, YearQuarter
, và nhiều hơn nữa .
Với thời gian Joda
DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);
ClassNotDefinedException
ZonedDateTime
chứ không phải là một LocalDateTime
. "Địa phương" có nghĩa là không bị ràng buộc với bất kỳ địa phương cụ thể nào và không bị ràng buộc với dòng thời gian. Giống như "Giáng sinh bắt đầu vào nửa đêm ngày 25 tháng 12 năm 2015" là một thời điểm khác nhau trên các múi giờ khác nhau, không có nghĩa gì cho đến khi bạn áp dụng một múi giờ cụ thể để có được một khoảnh khắc cụ thể trên dòng thời gian. Hơn nữa, nếu không có Giờ tiết kiệm ánh sáng ban ngày (DST) và các bất thường khác sẽ không được xử lý khi sử dụng LocalDateTime như vậy. Xem câu trả lời của tôi bằng cách so sánh.
java.util.Date
đối tượng như người yêu cầu đã hỏi chúng tôi ZonedDateTime.toInstant()
và Date.from()
như được mô tả ở đây stackoverflow.com/a/32274725/5661065
Sử dụng lớp java.util.concản.TimeUnit mới, bạn có thể làm như thế này
Date oldDate = new Date(); // oldDate == current time
Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours
Cái gì đó như:
Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() +
(2L * hoursInMillis)); // Adds 2 hours
java.util.Date
, java.util.Calendar
và java.text.SimpleDateFormat
hiện đang là di sản , được thay thế bởi các lớp java.time được tích hợp trong Java 8 & Java 9. Xem Hướng dẫn của Oracle .
Đây là một đoạn mã khác khi Date
đối tượng của bạn ở định dạng Datetime. Vẻ đẹp của mã này là, Nếu bạn cho số giờ nhiều hơn, ngày cũng sẽ cập nhật tương ứng.
String myString = "09:00 12/12/2014";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd/MM/yyyy");
Date myDateTime = null;
//Parse your string to SimpleDateFormat
try
{
myDateTime = simpleDateFormat.parse(myString);
}
catch (ParseException e)
{
e.printStackTrace();
}
System.out.println("This is the Actual Date:"+myDateTime);
Calendar cal = new GregorianCalendar();
cal.setTime(myDateTime);
//Adding 21 Hours to your Date
cal.add(Calendar.HOUR_OF_DAY, 21);
System.out.println("This is Hours Added Date:"+cal.getTime());
Đây là đầu ra:
This is the Actual Date:Fri Dec 12 09:00:00 EST 2014
This is Hours Added Date:Sat Dec 13 06:00:00 EST 2014
Date argDate = new Date(); //set your date.
String argTime = "09:00"; //9 AM - 24 hour format :- Set your time.
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm");
String dateTime = sdf.format(argDate) + " " + argTime;
Date requiredDate = dateFormat.parse(dateTime);
Nếu bạn sẵn sàng sử dụng java.time
, đây là một phương pháp để thêm thời lượng được định dạng ISO 8601:
import java.time.Duration;
import java.time.LocalDateTime;
...
LocalDateTime yourDate = ...
...
// Adds 1 hour to your date.
yourDate = yourDate.plus(Duration.parse("PT1H")); // Java.
// OR
yourDate = yourDate + Duration.parse("PT1H"); // Groovy.
Duration.parse(iso8601duration)
Thật thú vị, cảm ơn, nhưng bạn không thể sử dụng toán tử +
trên LocalDateTime
, bạn có thể muốn chỉnh sửa nó. Nhưng .plus(...)
không làm việc.
Date
đối tượng, đại diện cho một thời điểm cụ thể trong UTC. Việc bạn sử dụng LocalDateTime
không giải quyết được Câu hỏi. LocalDateTime
thiếu bất kỳ khái niệm nào về múi giờ hoặc bù từ UTC và do đó không thể biểu thị một khoảnh khắc. Sai lớp cho vấn đề này. Xem sự khác biệt giữa Instant và LocalDateTime là gì?
Date
Đối tượng @BasilBourque không được dùng nữa. Câu hỏi mơ hồ khi nói về múi giờ để câu trả lời của tôi đứng vững. Hơn nữa, bạn chỉ có thể trao đổi ra LocalDateTime
cho ZonedDateTime
.
Bạn có thể làm điều đó với API Joda DateTime
DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
bằng cách sử dụng các lớp Java 8. chúng ta có thể thao tác ngày giờ rất dễ dàng như dưới đây.
LocalDateTime today = LocalDateTime.now();
LocalDateTime minusHours = today.minusHours(24);
LocalDateTime minusMinutes = minusHours.minusMinutes(30);
LocalDate localDate = LocalDate.from(minusMinutes);
Date
đối tượng, đại diện cho một thời điểm cụ thể trong UTC. Việc bạn sử dụng LocalDateTime
không giải quyết được Câu hỏi. LocalDateTime
thiếu bất kỳ khái niệm nào về múi giờ hoặc bù từ UTC và do đó không thể biểu thị một khoảnh khắc. Sai lớp cho vấn đề này. Xem sự khác biệt giữa Instant và LocalDateTime là gì?
Bạn có thể sử dụng lớp LocalDateTime từ Java 8. Ví dụ:
long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));
Date
đối tượng, đại diện cho một thời điểm cụ thể trong UTC. Việc bạn sử dụng LocalDateTime
không giải quyết được Câu hỏi. LocalDateTime
thiếu bất kỳ khái niệm nào về múi giờ hoặc bù từ UTC và do đó không thể biểu thị một khoảnh khắc. Sai lớp cho vấn đề này. Xem sự khác biệt giữa Instant và LocalDateTime là gì?
Bạn có thể sử dụng phương pháp này, thật dễ hiểu và thực hiện:
public static java.util.Date AddingHHMMSSToDate(java.util.Date date, int nombreHeure, int nombreMinute, int nombreSeconde) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.HOUR_OF_DAY, nombreHeure);
calendar.add(Calendar.MINUTE, nombreMinute);
calendar.add(Calendar.SECOND, nombreSeconde);
return calendar.getTime();
}