วิธีลบ X day จากอ็อบเจกต์ Date ใน Java


147

ฉันต้องการทำสิ่งที่ชอบ:

Date date = new Date(); // current date
date = date - 300; // substract 300 days from current date and I want to use this "date"

ทำอย่างไร?


4
ข้อผูกมัดว่า "ใช้ Joda Time"
Steve McLeod

1
ลิงก์ต่อไปนี้อาจมีประโยชน์สำหรับคุณ [ป้อนคำอธิบายลิงก์ที่นี่] [1] [ป้อนคำอธิบายลิงก์ที่นี่] [2] [1]: stackoverflow.com/questions/212321/… [2]: stackoverflow.com/questions/ 2623610 / …
Ami

FYI คลาสวัน - เวลาเก่าที่ลำบากเช่นjava.util.Dateตอนนี้เป็นมรดกแทนที่ด้วยคลาสjava.time
Basil Bourque

คำตอบ:


280

Java 8 และใหม่กว่า

ด้วยการเปลี่ยนแปลงวันที่และเวลา API ของ Java 8 ให้ใช้ LocalDate

LocalDate date = LocalDate.now().minusDays(300);

ในทำนองเดียวกันคุณสามารถมี

LocalDate date = someLocalDateInstance.minusDays(300);

อ้างถึงhttps://stackoverflow.com/a/23885950/260990สำหรับการแปลระหว่าง java.util.Date <--> java.time.LocalDateTime

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

Java 7 และรุ่นก่อนหน้า

ใช้Calendar's add()วิธี

Calendar cal = Calendar.getInstance();
cal.setTime(dateInstance);
cal.add(Calendar.DATE, -30);
Date dateBefore30Days = cal.getTime();

22
มันคือการกำหนดวันที่กำหนดเองของคุณในกรณีที่คุณไม่ต้องการที่จะต้องพิจารณาวันที่ปัจจุบัน
Jigar Joshi

11
การจัดการ Date ของ Java นั้นเต็มไปด้วยผู้คนมากมาย!
digory doo

1
นี่คือคำตอบอายุ 4 ปี มีการเปลี่ยนแปลง DateTime API ใหม่ที่ทำกับเวอร์ชันล่าสุด ฉันจะแก้ไขคำตอบ
Jigar Joshi

FYI, ลำบากเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleTextFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียน ดูการสอนโดยออราเคิล
Basil Bourque

@JigarJoshi คงยอดเยี่ยมถ้าคุณอัพเดทคำตอบด้วย Java 8 API คำตอบของคุณคือคำตอบที่ผู้คนเห็นก่อน
jotaen

47

@JigarJoshi เป็นคำตอบที่ดีและแน่นอน @Tim แนะนำให้ใช้ Joda เวลา

java.util.Dateฉันเพียงต้องการที่จะเพิ่มความเป็นไปได้มากขึ้นที่จะลบวันจาก

Apache-คอมมอนส์

ความเป็นไปได้หนึ่งคือการใช้Apache-คอมมอน-lang คุณสามารถทำได้โดยใช้DateUtilsดังต่อไปนี้:

Date dateBefore30Days = DateUtils.addDays(new Date(),-30);

แน่นอนเพิ่มการcommons-langพึ่งพาที่จะทำเพียงการลบวันที่มันอาจจะไม่ใช่ตัวเลือกที่ดี แต่ถ้าคุณใช้อยู่แล้วcommons-langมันเป็นตัวเลือกที่ดี นอกจากนี้ยังมีวิธีการที่สะดวกในการaddYears, addMonths, addWeeksและอื่น ๆ ให้ดูที่การAPI ที่นี่

Java 8

ความเป็นไปได้อีกอย่างคือการใช้ประโยชน์จากสิ่งใหม่LocalDateจากJava 8โดยใช้minusDays(long days)วิธีการ:

LocalDate dateBefore30Days = LocalDate.now(ZoneId.of("Europe/Paris")).minusDays(30);

ไม่มีจุดที่จะใช้LocalDateTimeเป็นคลาสนั้นโดยเจตนาไม่มีแนวคิดของเขตเวลาหรือออฟเซ็ตจาก UTC ใช้เฉพาะเมื่อไม่ทราบเขต / ออฟเซ็ตหรือไม่เกี่ยวข้อง แทนที่จะใช้LocalDateและส่ง a ZoneIdเมื่อเรียกnowใช้เมธอด ดูคำตอบที่ถูกต้องโดย Jacob van Lingen
Basil Bourque

1
@BasilBourque หลังจากที่คุณแนะนำฉันจะตรวจสอบ api และคุณมีสิทธิ์อย่างสมบูรณ์ดังนั้นฉันจึงปรับปรุงคำตอบ ขอบคุณ
albciff

ไบรอัน Montellanoต้องการที่จะแสดงความคิดเห็น: ไม่ควรมีใด ๆsในก็เพียงDateUtils DateUtil
Ole VV

@ OleV.V Brian Montellano ผิดคุณสามารถตรวจสอบDateUtilsเอกสารได้
albciff

33

เพียงใช้สิ่งนี้เพื่อรับวันที่ก่อน 300 วันแทนที่ 300 ด้วยวันของคุณ:

Date date = new Date(); // Or where ever you get it from
Date daysAgo = new DateTime(date).minusDays(300).toDate();

ที่นี่

DateTime คือ org.joda.time.DateTime;

Date คือ java.util.Date


7
Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาและให้คำแนะนำแก่การโยกย้ายไปยังjava.timeชั้นเรียน
Basil Bourque

13

Java 8 Time API:

Instant now = Instant.now(); //current date
Instant before = now.minus(Duration.ofDays(300));
Date dateBefore = Date.from(before);

ฉันต้องหมายถึง Java 8 API ไม่ใช่ 7 และการพูดถึงแพ็คเกจjava.timeอาจช่วยได้ นอกจากนี้โดยทั่วไปแล้วคาดว่าจะมีการอภิปราย / คำอธิบายกับ Stack Overflow ไม่ใช่เพียงแค่ข้อมูลโค้ด แน่นอนคุณควรจะอธิบายDurationว่าเป็นมูลค่าเพิ่มของคำตอบของคุณมากกว่าที่มีอยู่โดยรถตู้ Lingen
Basil Bourque

Java 8 สาเหตุได้รับการแก้ไข
Grigory Kislin

อยู่ใกล้ แต่ควรจะแก้ไขวัตถุวันที่โดยพลการไม่ใช่ "ตอนนี้"
24415

9

อย่างที่คุณเห็นที่นี่มีการจัดการมากมายที่คุณสามารถทำได้ นี่คือตัวอย่างที่แสดงสิ่งที่คุณสามารถทำได้!

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();

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

//Substract one day to current date.
cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
System.out.println(dateFormat.format(cal.getTime()));

/* Can be Calendar.DATE or
*  Calendar.MONTH, Calendar.YEAR, Calendar.HOUR, Calendar.SECOND
*/

@Jigar Joshi: ฉันไม่เห็นคำตอบของคุณ ... ฉันควรจะลบของฉันไหม?
waldyr.ar

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

9

ด้วย Java 8 มันง่ายมากในตอนนี้:

 LocalDate date = LocalDate.now().minusDays(300);

คำแนะนำที่ดีกับ API ใหม่สามารถพบได้ที่นี่


4
ฉันแนะนำให้ส่งโซนเวลาเสริม (หรือ offset-from-UTC) ไปยังnowวิธีการนั้นเสมอ หากไม่ได้ระบุเขตเวลาเริ่มต้นปัจจุบันของ JVM จะถูกนำไปใช้โดยปริยายและเงียบ ๆ ค่าเริ่มต้นนั้นอยู่นอกการควบคุมของคุณและสามารถเปลี่ยนแปลงได้ตลอดเวลาแม้ในระหว่างรันไทม์ ตัวอย่าง: LocalDate.now( ZoneId.of( "America/Montreal" ).
Basil Bourque

จะต้องอยู่ในวัตถุวันที่ตามอำเภอใจตามคำถามไม่ใช่ "ตอนนี้"
384

1

ฉันได้สร้างฟังก์ชั่นเพื่อให้งานง่ายขึ้น

  • เป็นเวลา 7 วันหลังจากวันที่สตริง: dateCalculate(dateString,"yyyy-MM-dd",7);

  • ที่จะได้รับ 7 วันถึงวันที่สตริง: dateCalculate(dateString,"yyyy-MM-dd",-7);


public static String dateCalculate(String dateString, String dateFormat, int days) {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat s = new SimpleDateFormat(dateFormat);
    try {
        cal.setTime(s.parse(dateString));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    cal.add(Calendar.DATE, days);
    return s.format(cal.getTime());
}

คำตอบนี้จะใช้ลำบากเรียนวันเวลาเก่า ๆ เช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatว่าขณะนี้มีมรดกแทนที่โดยjava.timeชั้นเรียน ดูการสอนโดยออราเคิล
Basil Bourque

คำถามเกี่ยวข้องกับวัตถุวันเวลาไม่ใช่การสร้างสตริง โดยวิธีการที่LocalDate.parse( "2017-01-23").plusWeeks( 1 )ง่ายกว่าการเขียนวิธีการของคุณเองและเป็นเอกสารด้วยตนเองมากขึ้น
Basil Bourque

0

คุณสามารถลบได้อย่างง่ายดายด้วยปฏิทินด้วย SimpleDateFormat

 public static String subtractDate(String time,int subtractDay) throws ParseException {


        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH);
        cal.setTime(sdf.parse(time));
        cal.add(Calendar.DATE,-subtractDay);
        String wantedDate = sdf.format(cal.getTime());

        Log.d("tag",wantedDate);
        return wantedDate;

    }

-4
c1.set(2017, 12 , 01); //Ex: 1999 jan 20    //System.out.println("Date is : " + sdf.format(c1.getTime()));
  c1.add(Calendar.MONTH, -2); // substract 1 month
  System.out.println
  ("Date minus 1 month : "
      + sdf.format(c1.getTime()));

2
ยินดีต้อนรับสู่ SO กรุณางดคำตอบจากรหัสเท่านั้น ดู stackoverflow.com/help/how-to-answer และโปรดจัดรูปแบบรหัสของคุณ
Uwe Allner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.