การเปลี่ยนวันที่ Java ย้อนหลังหนึ่งชั่วโมง


124

ฉันมีวัตถุวันที่ Java:

Date currentDate = new Date();

ซึ่งจะให้วันที่และเวลาปัจจุบัน ตัวอย่าง:

Thu Jan 12 10:17:47 GMT 2012

แต่ฉันต้องการรับวันที่โดยเปลี่ยนเป็นหนึ่งชั่วโมงย้อนหลังดังนั้นควรให้ฉัน:

Thu Jan 12 09:17:47 GMT 2012

วิธีที่ดีที่สุดจะทำอย่างไร?


มีmktimejava ที่เทียบเท่าหรือไม่ ลบ 60 นาทีจากมัน?
Shiplu Mokaddim

คำตอบ:


244

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
เพียงแค่เปลี่ยนความจริงว่ามี Calendar.HOUR ซึ่งทำงานร่วมกับนาฬิกา 12 ชั่วโมงและปฏิทินHOUR_OF_DAY เป็น
Wolf

วิธีแก้ปัญหาแรกกับปฏิทินจะใช้งานได้หรือไม่หากเวลานั้นเป็นเวลาเที่ยงคืนของวันหนึ่งและคุณต้องการให้เร็วขึ้นหนึ่งชั่วโมงซึ่งก็คือ 23.00 น. ของวันก่อนหน้า
George Arokiam

1
@GeorgeArokiam ใช่แล้ว
Kimi

66

คล้ายกับน้ำยาของ @Sumit Jain

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

หรือ

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

3
วิธีแก้ปัญหาที่ดีกว่า การสร้างอินสแตนซ์ปฏิทินดูเหมือนการใช้งานเกินในแอปพลิเคชันนี้
www.Decompiler.com

2
@cosmolev Calendar มีมากเกินไปในตัวอย่างส่วนใหญ่ที่ฉันพบ
Peter Lawrey

2
@Stoan ฉันได้เพิ่มตัวอย่างที่อ่านได้มากขึ้น คุณควรทราบว่าปฏิทินไม่มีประสิทธิภาพอย่างไม่น่าเชื่อ
Peter Lawrey

@PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); นี่น่าจะช้ากว่า 10 นาที?
Siya Sosibo

15

TL; DR

ในUTC :

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

หรือแบ่งเขต:

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

ใช้ java.time

Java 8 และใหม่กว่ามีกรอบjava.timeใหม่ในตัว

Instant

หากคุณสนใจเฉพาะ UTC (GMT) ให้ใช้Instantชั้นเรียน

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

ถ่ายโอนไปยังคอนโซล

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

ทันที: 2015-10-29T00: 37: 48.921Z | instantHourEarlier: 2015-10-28T23: 37: 48.921Z

สังเกตว่าในช่วงเวลานี้เกิดขึ้นได้อย่างไรในการข้ามกลับไปยังวันที่ของเมื่อวาน

ZonedDateTime

หากคุณสนใจเกี่ยวกับเขตเวลาให้ใช้ZonedDateTimeชั้นเรียน คุณสามารถเริ่มต้นด้วยการค้นหาทันใจและกำหนดเขตเวลาZoneIdวัตถุ ชั้นนี้จะจัดการปรับเปลี่ยนที่จำเป็นสำหรับความผิดปกติเช่นปรับเวลาตามฤดูกาล (DST)

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

ถ่ายโอนไปยังคอนโซล

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

ทันที: 2015-10-29T00: 50: 30.778Z

zdt: 2015-10-28T20: 50: 30.778-04: 00 [อเมริกา / มอนทรีออล]

zdtHourEarlier: 2015-10-28T19: 50: 30.778-04: 00 [อเมริกา / มอนทรีออล]

การแปลง

ขณะนี้คลาส java.util.Date/.Calendar เก่าล้าสมัยแล้ว หลีกเลี่ยงพวกเขา พวกเขามีปัญหาและสับสนฉาวโฉ่

เมื่อคุณต้องใช้คลาสเก่าสำหรับการดำเนินการกับรหัสเก่าที่ยังไม่ได้อัปเดตสำหรับประเภท java.time ให้เรียกใช้วิธีการแปลง นี่คือตัวอย่างโค้ดที่มาจาก Instant หรือ ZonedDateTime ไปยัง java.util.Date

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

…หรือ…

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

เกี่ยวกับjava.time

java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date, CalendarและSimpleDateFormatและ

โครงการJoda-Timeขณะนี้อยู่ในโหมดการบำรุงรักษาแนะนำการโยกย้ายไปยังคลาสjava.time

ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310

คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูลของคุณ ใช้ไดรเวอร์ JDBC ที่สอดคล้องกับJDBC 4.2หรือใหม่กว่า ไม่จำเป็นต้องมีสตริงไม่จำเป็นต้องมีjava.sql.*คลาส

จะหาคลาส java.time ได้ที่ไหน?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11และใหม่กว่า - เป็นส่วนหนึ่งของ Java API มาตรฐานพร้อมการใช้งานแบบรวม
    • Java 9 เพิ่มคุณสมบัติและการแก้ไขเล็กน้อย
  • Java SE 6และ Java SE 7
    • ส่วนใหญ่ของjava.timeการทำงานจะกลับรังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับ
  • Android

โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โปรเจ็กต์นี้เป็นพื้นที่พิสูจน์สำหรับการเพิ่ม java.time ในอนาคต คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval, YearWeek, YearQuarterและอื่น ๆ อีกมากมาย


สวัสดีครับฉันยังไม่พบวิธีที่เหมาะสมในการสร้าง "เวลาที่แล้ว" สำหรับ Instant
Ticherhaz




4

คุณสามารถใช้จากรหัสร้องสำหรับวันที่และเวลา:

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()));

เอาท์พุต:

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

ลิงค์นี้ดี: ดูที่นี่

และดู: ดูด้วย

และ: ที่นี่

และ: ที่นี่

และ: ที่นี่

หากคุณต้องการเวลาเพียง:

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

2
FYI: คำตอบนี้ใช้คลาส Date-time แบบเก่าที่ยุ่งยากซึ่งตอนนี้เป็นแบบดั้งเดิมแทนที่ด้วยคลาส java.time ที่ทันสมัย
Basil Bourque

0

ซึ่งสามารถทำได้โดยใช้java.util.Date. รหัสต่อไปนี้จะลบ 1 ชั่วโมงจากวันที่ของคุณ

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

ในทำนองเดียวกันสำหรับการลบ 20 วินาทีจากวันที่ของคุณ

newDate = DateUtils.addSeconds(date, -20)    

-1

รับเวลาเป็นมิลลิวินาทีลบนาทีของคุณเป็นมิลลิวินาทีและแปลงเป็นวันที่ ที่นี่คุณต้องคัดค้าน !!!

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

@ Makky: ฉันรู้ว่ามีการเปลี่ยนแปลง แต่ไม่ใช่คำตอบที่ผิด !!! ทำไมคุณถึงตอบผิด? คุณเห็นคำตอบที่ยอมรับครบถ้วนหรือไม่?
Zenith

1
ทำไมคุณถึงตอบคำถามที่อายุ 5 ขวบและยอมรับคำตอบแล้ว
Makky

คำตอบนี้ไม่ได้ให้คุณค่าเกินกว่าคำตอบที่มีอยู่เป็นปี และคำตอบนี้ใช้คลาสวันที่และเวลาที่แย่มากซึ่งถูกแทนที่มาหลายปีโดยคลาส java.time ปัญหาอื่น: คำตอบนี้ไม่สนใจปัญหาเรื่องเขตเวลาและแสดงรหัสที่จะใช้เขตเวลาเริ่มต้นปัจจุบันของ JVM ในขณะที่คำถามถามถึง GMT / UTC ดูส่วนต่อไปของคำตอบที่ถูกต้องโดย Kimiหรือดูคำตอบของฉันสำหรับการสนทนาเพิ่มเติม
Basil Bourque

-1

มันใช้งานได้สำหรับฉันแทนการใช้รูปแบบในการทำงานกับเวลาให้ใช้วิธีการแยกวิเคราะห์และ toString ()

สตริง localTime = "6:11"; LocalTime localTime = LocalTime.parse (เวลาท้องถิ่น)

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


1
คำตอบนี้ไม่ได้อยู่ที่คำถาม คำถามเกี่ยวกับช่วงเวลาของวันเพียงอย่างเดียว
Basil Bourque
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.