ใครรู้วิธีง่ายๆในการใช้ปฏิทิน Java เพื่อลบ X วันจากวันที่?
ฉันไม่สามารถค้นหาฟังก์ชั่นใด ๆ ที่อนุญาตให้ฉันลบ X วันจากวันที่ใน Java โดยตรง ใครบางคนชี้ให้ฉันไปในทิศทางที่ถูกต้อง?
ใครรู้วิธีง่ายๆในการใช้ปฏิทิน Java เพื่อลบ X วันจากวันที่?
ฉันไม่สามารถค้นหาฟังก์ชั่นใด ๆ ที่อนุญาตให้ฉันลบ X วันจากวันที่ใน Java โดยตรง ใครบางคนชี้ให้ฉันไปในทิศทางที่ถูกต้อง?
คำตอบ:
นำมาจากเอกสารที่นี่ :
เพิ่มหรือลบจำนวนเวลาที่ระบุในฟิลด์ปฏิทินที่กำหนดตามกฎของปฏิทิน ตัวอย่างเช่นหากต้องการลบ 5 วันจากเวลาปัจจุบันของปฏิทินคุณสามารถทำได้โดยโทร:
Calendar calendar = Calendar.getInstance(); // this would default to now calendar.add(Calendar.DAY_OF_MONTH, -5).
Calendar.DAY_OF_MONTH
ในกรณีนี้เนื่องจากจะไม่จัดการม้วนระหว่างเดือนตามที่คุณต้องการ ใช้Calendar.DAY_OF_YEAR
แทน
คุณสามารถใช้add
วิธีการและส่งผ่านจำนวนลบ อย่างไรก็ตามคุณสามารถเขียนวิธีที่ง่ายกว่าซึ่งไม่ใช้Calendar
คลาสดังต่อไปนี้
public static void addDays(Date d, int days)
{
d.setTime( d.getTime() + (long)days*1000*60*60*24 );
}
สิ่งนี้ได้รับค่าการประทับเวลาของวันที่ (มิลลิวินาทีนับตั้งแต่ยุค) และเพิ่มจำนวนมิลลิวินาทีที่เหมาะสม คุณสามารถส่งจำนวนเต็มลบเพื่อให้พารามิเตอร์ days ทำการลบได้ นี่จะง่ายกว่าโซลูชันปฏิทิน "เหมาะสม":
public static void addDays(Date d, int days)
{
Calendar c = Calendar.getInstance();
c.setTime(d);
c.add(Calendar.DATE, days);
d.setTime( c.getTime().getTime() );
}
โปรดทราบว่าการแก้ปัญหาทั้งสองนี้จะเปลี่ยนDate
วัตถุที่ส่งผ่านเป็นพารามิเตอร์แทนที่จะส่งค่าใหม่Date
ทั้งหมด ทั้งสองฟังก์ชั่นสามารถเปลี่ยนแปลงได้อย่างง่ายดายเพื่อทำอย่างอื่นหากต้องการ
java.util.Calendar
ตอนนี้เป็นแบบดั้งเดิมแทนที่ด้วยคลาสjava.time ดูการสอนโดยออราเคิล
คำตอบของแอนสันจะทำงานได้ดีสำหรับกรณีที่เรียบง่าย แต่ถ้าคุณกำลังจะทำการคำนวณวันที่ใด ๆ ที่ซับซ้อนมากขึ้นผมอยากแนะนำให้ตรวจสอบจากJoda เวลา มันจะทำให้ชีวิตของคุณง่ายขึ้นมาก
FYI ใน Joda Time ที่คุณสามารถทำได้
DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);
LocalDate.now().minusDays( 10 )
ระบุเขตเวลาได้ดีกว่า
LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )
คลาสวันที่และเวลาเก่าที่มาพร้อมกับ Java เวอร์ชันแรก ๆ เช่นjava.util.Date
/ .Calendar
ได้พิสูจน์แล้วว่ามีปัญหาสับสนและมีข้อบกพร่อง หลีกเลี่ยงพวกเขา
Java 8 และใหม่กว่าแทนที่คลาสเก่าเหล่านั้นด้วยเฟรมเวิร์ก java.time ใหม่ ดูการสอน กำหนดโดยJSR 310แรงบันดาลใจจากJoda เวลาและขยายโดยThreeTen-พิเศษโครงการ โครงการ ThreeTen-Backport back-ports คลาสไปยัง Java 6 & 7; โครงการ ThreeTenABP สำหรับ Android
คำถามนั้นคลุมเครือไม่ชัดเจนหากถามถึงวันที่อย่างเดียวหรือเป็นวันที่
LocalDate
สำหรับวันที่เท่านั้นโดยไม่มีเวลาให้ใช้LocalDate
คลาส โปรดทราบว่าเขตเวลามีความสำคัญอย่างยิ่งในการกำหนดวันที่เช่น "วันนี้"
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );
ZonedDateTime
ถ้าคุณหมายถึงวันที่เวลานั้นใช้Instant
ระดับที่จะได้รับสักครู่บนไทม์ไลน์ในUTC จากนั้นปรับเป็นเขตเวลาเพื่อรับZonedDateTime
วัตถุ
Instant now = Instant.now(); // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );
java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date
, และCalendar
SimpleDateFormat
Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาให้คำแนะนำแก่การโยกย้ายไปยังjava.timeชั้นเรียน
ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310
คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูลของคุณ ใช้ไดรเวอร์ JDBC ที่สอดคล้องกับJDBC 4.2หรือใหม่กว่า ไม่จำเป็นต้องใช้สตริงไม่จำเป็นต้องมีjava.sql.*
คลาส
จะรับคลาส java.time ได้ที่ไหน?
โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โครงการนี้เป็นพื้นฐานที่พิสูจน์ได้สำหรับการเพิ่มเติมในอนาคตไปยัง java.time คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval
, YearWeek
, YearQuarter
และอื่น ๆ อีกมากมาย
int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);
แก้ไข: parser ดูเหมือนจะไม่ชอบลิงค์ไปยัง Javadoc ดังนั้นนี่มันเป็นข้อความธรรมดา:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#add(int , int)
แทนการเขียนของตัวเองaddDays
ตามที่แนะนำโดยเอลีฉันชอบที่จะใช้DateUtils
จากอาปาเช่ มันมีประโยชน์โดยเฉพาะเมื่อคุณต้องใช้หลาย ๆ ที่ในโครงการของคุณ
API กล่าวว่า:
addDays(Date date, int amount)
เพิ่มจำนวนวันให้กับวันที่ส่งคืนวัตถุใหม่
โปรดทราบว่ามันส่งคืนDate
วัตถุใหม่และไม่ทำการเปลี่ยนแปลงไปก่อนหน้านี้เอง
สามารถทำได้ง่าย ๆ ดังต่อไปนี้
Calendar calendar = Calendar.getInstance();
// from current time
long curTimeInMills = new Date().getTime();
long timeInMills = curTimeInMills - 5 * (24*60*60*1000); // `enter code here`subtract like 5 days
calendar.setTimeInMillis(timeInMills);
System.out.println(calendar.getTime());
// from specific time like (08 05 2015)
calendar.set(Calendar.DAY_OF_MONTH, 8);
calendar.set(Calendar.MONTH, (5-1));
calendar.set(Calendar.YEAR, 2015);
timeInMills = calendar.getTimeInMillis() - 5 * (24*60*60*1000);
calendar.setTimeInMillis(timeInMills);
System.out.println(calendar.getTime());
LocalDate
นั้นง่ายกว่าและเหมาะสมกว่ามาก
มีคนแนะนำ Joda Time ดังนั้น - ฉันใช้คลาส CalendarDateนี้http://calendardate.sourceforge.net
มันเป็นโครงการที่ค่อนข้างแข่งขันกับ Joda Time แต่พื้นฐานมากขึ้นใน 2 ชั้นเท่านั้น มันมีประโยชน์มากและทำงานได้ดีสำหรับสิ่งที่ฉันต้องการเนื่องจากฉันไม่ต้องการใช้แพคเกจที่ใหญ่กว่าโครงการของฉัน แตกต่างจากจาวาหน่วยที่เล็กที่สุดของมันคือวันดังนั้นมันจึงเป็นวันที่จริง ๆ (ไม่ต้องมีหน่วยเป็นมิลลิวินาที เมื่อคุณสร้างวันที่สิ่งที่คุณต้องทำเพื่อลบคือ myDay.addDays (-5) เพื่อย้อนกลับไป 5 วัน คุณสามารถใช้มันเพื่อค้นหาวันในสัปดาห์และสิ่งต่าง ๆ เช่นนั้น ตัวอย่างอื่น:
CalendarDate someDay = new CalendarDate(2011, 10, 27);
CalendarDate someLaterDay = today.addDays(77);
และ:
//print 4 previous days of the week and today
String dayLabel = "";
CalendarDate today = new CalendarDate(TimeZone.getDefault());
CalendarDateFormat cdf = new CalendarDateFormat("EEE");//day of the week like "Mon"
CalendarDate currDay = today.addDays(-4);
while(!currDay.isAfter(today)) {
dayLabel = cdf.format(currDay);
if (currDay.equals(today))
dayLabel = "Today";//print "Today" instead of the weekday name
System.out.println(dayLabel);
currDay = currDay.addDays(1);//go to next day
}
ฉันเชื่อว่าวิธีที่ดีและสะอาดในการลบหรือเพิ่มหน่วยเวลา (เดือน, วัน, ชั่วโมง, นาที, วินาที, ... ) สามารถทำได้โดยใช้คลาสjava.time.Instant
ตัวอย่างการลบ 5 วันจากเวลาปัจจุบันและรับผลลัพธ์เป็นวันที่:
new Date(Instant.now().minus(5, ChronoUnit.DAYS).toEpochMilli());
อีกตัวอย่างสำหรับการลบ 1 ชั่วโมงและเพิ่ม 15 นาที:
Date.from(Instant.now().minus(Duration.ofHours(1)).plus(Duration.ofMinutes(15)));
หากคุณต้องการความแม่นยำมากขึ้นอินสแตนซ์วัดได้สูงสุดนาโนวินาที วิธีการจัดการส่วน nanosecond:
minusNano()
plusNano()
getNano()
นอกจากนี้โปรดทราบว่าวันที่นั้นไม่ถูกต้องเท่า Instant
Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
อีไลคอร์ทไรท์คำตอบที่สองนั้นผิดมันควรจะเป็น:
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());
addDays
; ทางออกของเขาถูกต้อง days
หากคุณต้องการที่จะลบวันนับจากวันที่คุณผ่านในค่าลบสำหรับ
java.util.Calendar
ตอนนี้เป็นแบบดั้งเดิมแทนที่ด้วยคลาสjava.time ดูการสอนโดยออราเคิล