Thay đổi ngày Java một giờ trở lại


124

Tôi có một đối tượng ngày trong Java:

Date currentDate = new Date();

Điều này sẽ cung cấp ngày và giờ hiện tại. Thí dụ:

Thu Jan 12 10:17:47 GMT 2012

Thay vào đó, tôi muốn lấy ngày tháng, thay đổi nó thành một giờ lùi lại, vì vậy nó sẽ cho tôi:

Thu Jan 12 09:17:47 GMT 2012

Cách tốt nhất để làm điều đó là gì?


mktimetương đương trong java không? trừ đi 60 phút từ nó?
Shiplu Mokaddim

Câu trả lời:


243

java.util.Calendar

Calendar cal = Calendar.getInstance();
// remove next line if you're always using the current time.
cal.setTime(currentDate);
cal.add(Calendar.HOUR, -1);
Date oneHourBack = cal.getTime();

java.util.Date

new Date(System.currentTimeMillis() - 3600 * 1000);

org.joda.time.LocalDateTime

new LocalDateTime().minusHours(1)

Java 8: java.time.LocalDateTime

LocalDateTime.now().minusHours(1)

Java 8 java.time.Instant

// always in UTC if not timezone set
Instant.now().minus(1, ChronoUnit.HOURS));
// with timezone, Europe/Berlin for example
Instant.now()
       .atZone(ZoneId.of("Europe/Berlin"))
       .minusHours(1));

8
Chỉ cần thay đổi thực tế là có Lịch.HOUR
Wolf

Giải pháp đầu tiên với Lịch có hoạt động không nếu thời gian là nửa đêm của một ngày và bạn muốn sớm hơn một giờ tức là 11 giờ đêm ngày hôm trước?
George Arokiam

1
@GeorgeArokiam vâng nó sẽ
Kimi

66

Tương tự với giải pháp của @Sumit Jain

Date currentDate = new Date(System.currentTimeMillis() - 3600 * 1000);

hoặc là

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));

3
Cách giải quyết tốt hơn. Việc tạo phiên bản lịch trông giống như quá mức cần thiết trong ứng dụng cụ thể này.
www.Decompiler.com

2
@cosmolev Lịch quá mức cần thiết trong hầu hết các ví dụ mà tôi tìm thấy.
Peter Lawrey

2
@Stoan Tôi đã thêm một ví dụ dễ đọc hơn. Bạn nên lưu ý rằng Lịch cực kỳ kém hiệu quả.
Peter Lawrey

@PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); Điều này sẽ chậm hơn 10 phút?
Siya Sosibo

15

tl; dr

Trong UTC :

Instant.now().minus( 1 , ChronoUnit.HOURS ) 

Hoặc, khoanh vùng:

Instant.now()
       .atZone( ZoneId.of ( "America/Montreal" ) )
       .minusHours( 1 )

Sử dụng java.time

Java 8 trở lên được tích hợp sẵn khuôn khổ java.time mới .

Instant

Nếu bạn chỉ quan tâm đến UTC (GMT), thì hãy sử dụng Instantlớp học.

Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );

Đổ vào bảng điều khiển.

System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );

tức thì: 2015-10-29T00: 37: 48.921Z | tức thìHourEarlier: 2015-10-28T23: 37: 48.921Z

Lưu ý làm thế nào ngay lập tức này đã xảy ra để bỏ qua ngày hôm qua.

ZonedDateTime

Nếu bạn quan tâm đến múi giờ, hãy sử dụng ZonedDateTimelớp học. Bạn có thể bắt đầu với một Instant và gán một múi giờ, một ZoneIdđối tượng. Lớp này xử lý các điều chỉnh cần thiết cho các dị thường như Giờ tiết kiệm ánh sáng ban ngày (DST) .

Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
ZonedDateTime zdtHourEarlier = zdt.minus ( 1 , ChronoUnit.HOURS );

Đổ vào bảng điều khiển.

System.out.println ( "instant: " + instant + "\nzdt: " + zdt + "\nzdtHourEarlier: " + zdtHourEarlier );

tức thì: 2015-10-29T00: 50: 30.778Z

zdt: 2015-10-28T20: 50: 30.778-04: 00 [Mỹ / Montreal]

zdtHourEarlier: 2015-10-28T19: 50: 30.778-04: 00 [Mỹ / Montreal]

Chuyển đổi

Các lớp java.util.Date/.Calendar cũ hiện đã lỗi thời. Tránh chúng. Chúng nổi tiếng là rắc rối và khó hiểu.

Khi bạn phải sử dụng các lớp cũ để hoạt động với mã cũ chưa được cập nhật cho các loại java.time, hãy gọi các phương thức chuyển đổi. Đây là mã ví dụ đi từ Instant hoặc ZonedDateTime đến java.util.Date.

java.util.Date date = java.util.Date.from( instant );

…hoặc là…

java.util.Date date = java.util.Date.from( zdt.toInstant() );

Giới thiệu về java.time

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, hãy xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow để có 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 mình. 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.

Lấy các lớp java.time ở đâu?

Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là cơ sở chứng minh cho những bổ sung có thể có 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 .


Xin chào ông, tôi vẫn chưa thể tìm thấy cách thích hợp để tạo "thời gian trước" cho Instant.
Ticherhaz

9

Sử dụng Lịch .

Calendar cal = Calendar.getInstance();

cal.setTime(new Date());
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) - 1);

7

Hoặc sử dụng thư viện Joda Time nổi tiếng :

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();

5

Chỉ cần trừ số mili giây trong một giờ kể từ ngày.

currentDate.setTime(currentDate.getTime() - 3600 * 1000));


4

Bạn có thể sử dụng từ mã dưới đây cho ngày và giờ:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
       //get current date time with Calendar()
       Calendar cal = Calendar.getInstance();
       System.out.println("Current Date Time : " + dateFormat.format(cal.getTime()));

       cal.add(Calendar.DATE, 1);
       System.out.println("Add one day to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, 1);
       System.out.println("Add one month to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, 1);
       System.out.println("Add one year to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, 1);
       System.out.println("Add one hour to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, 1);
       System.out.println("Add one minute to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, 1);
       System.out.println("Add one second to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.DATE, -1);
       System.out.println("Subtract one day from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, -1);
       System.out.println("Subtract one month from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, -1);
       System.out.println("Subtract one year from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, -1);
       System.out.println("Subtract one hour from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, -1);
       System.out.println("Subtract one minute from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, -1);
       System.out.println("Subtract one second from current date : " + dateFormat.format(cal.getTime()));

Đầu ra:

Current Date Time : 2008/12/28 10:24:53
Add one day to current date : 2008/12/29 10:24:53
Add one month to current date : 2009/01/28 10:24:53
Add one year to current date : 2009/12/28 10:24:53
Add one hour to current date : 2008/12/28 11:24:53
Add one minute to current date : 2008/12/28 10:25:53
Add one second to current date : 2008/12/28 10:24:54
Subtract one day from current date : 2008/12/27 10:24:53
Subtract one month from current date : 2008/11/28 10:24:53
Subtract one year from current date : 2007/12/28 10:24:53
Subtract one hour from current date : 2008/12/28 09:24:53
Subtract one minute from current date : 2008/12/28 10:23:53
Subtract one second from current date : 2008/12/28 10:24:52

Link này hay: Xem tại đây

Và xem: Xem quá

Và: Đây

Và: Đây

Và: Đây

Nếu bạn cần thời gian:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

2
FYI: Câu trả lời này sử dụng các lớp Date-time cũ rắc rối mà bây giờ là kế thừa, được thay thế bởi các lớp java.time hiện đại.
Basil Bourque

0

Điều này có thể đạt được bằng cách sử dụng java.util.Date. Đoạn mã sau sẽ trừ đi 1 giờ kể từ ngày của bạn.

Date date = new Date(yourdate in date format);
Date newDate = DateUtils.addHours(date, -1)

Tương tự để trừ 20 giây cho ngày của bạn

newDate = DateUtils.addSeconds(date, -20)    

-1

Lấy thời gian tính bằng mili giây, trừ số phút của bạn bằng mili giây và chuyển nó thành Ngày. Ở đây bạn cần phải đối tượng hóa một !!!

    int minutes = 60;
    long currentDateTime = System.currentTimeMillis();
    Date currentDate = new Date(currentDateTime - minutes*60*1000);
    System.out.println(currentDate);

@Makky: Tôi biết mọi thứ đã thay đổi. Nhưng nó không phải là một câu trả lời sai !!! Tại sao bạn lại cho đây là một câu trả lời sai? Bạn đã thấy câu trả lời được chấp nhận đầy đủ chưa?
Zenith

1
Tại sao bạn thậm chí sẽ trả lời cho một câu hỏi đã 5 tuổi và đã được chấp nhận câu trả lời.
Makky

Câu trả lời này không cung cấp giá trị nào ngoài các Câu trả lời đã tồn tại nhiều năm tuổi. Và câu trả lời này sử dụng một cách vô tình các lớp date-time cũ khủng khiếp đã được thay thế trong nhiều năm bởi các lớp java.time. Một vấn đề khác: Câu trả lời này bỏ qua vấn đề về múi giờ và hiển thị mã sẽ sử dụng múi giờ mặc định hiện tại của JVM trong khi Câu hỏi yêu cầu GMT / UTC. Xem phần sau của Câu trả lời đúng của Kimi hoặc xem Câu trả lời của tôi để thảo luận thêm.
Basil Bourque

-1

Nó hoạt động với tôi thay vì sử dụng định dạng. Để làm việc với thời gian, chỉ cần sử dụng các phương thức phân tích cú pháp và toString ()

String localTime = "6:11"; LocalTime localTime = LocalTime.parse (localtime)

LocalTime lt = 6:11; localTime = lt.toString ()


1
Câu trả lời này không giải quyết Câu hỏi. Câu hỏi chỉ về hơn một thời gian trong ngày.
Basil Bourque
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.