Yanıtlar:
Alındığı burada docs :
Takvimin kurallarına bağlı olarak, belirtilen takvim alanına belirtilen süreyi toplar veya çıkarır. Örneğin, takvimin geçerli saatinden 5 gün çıkarmak için şunları arayarak gerçekleştirebilirsiniz:
Calendar calendar = Calendar.getInstance(); // this would default to now calendar.add(Calendar.DAY_OF_MONTH, -5).
Calendar.DAY_OF_MONTHgibi aylar arasında ruloyu işlemeyeceği için bu durumda kullanmazsınız . Calendar.DAY_OF_YEARBunun yerine kullanın
addYöntemi kullanabilir ve negatif bir sayı iletebilirsiniz. Ancak, Calendaraşağıdaki gibi sınıfı kullanmayan daha basit bir yöntem de yazabilirsiniz
public static void addDays(Date d, int days)
{
d.setTime( d.getTime() + (long)days*1000*60*60*24 );
}
Bu, tarihin zaman damgası değerini alır (çağdan bu yana geçen milisaniye) ve uygun milisaniye sayısını ekler. Çıkarma işlemi yapmak için days parametresi için negatif bir tam sayı iletebilirsiniz. Bu, "uygun" takvim çözümünden daha basit olacaktır:
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() );
}
Bu çözümlerin her ikisinin de Datetamamen yeni bir döndürme yerine parametre olarak geçirilen nesneyi değiştirdiğini unutmayın Date. Her iki işlev de istenirse bunu yapmak için kolayca değiştirilebilir.
java.util.Calendarşimdi eski supplanted, java.time sınıfları. Oracle'ın Öğreticisine bakın .
Anson'un cevabı basit vaka için iyi çalışacaktır, ancak daha karmaşık tarih hesaplamaları yapacaksanız Joda Time'a göz atmanızı tavsiye ederim . Hayatınızı çok daha kolaylaştıracak.
Joda zamanında yapabileceğiniz FYI
DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);
LocalDate.now().minusDays( 10 )
Zaman dilimini belirtmek daha iyidir.
LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )
java.util.Date/ Gibi Java'nın ilk sürümleriyle birlikte gelen eski tarih-saat sınıflarının .Calendarzahmetli, kafa karıştırıcı ve kusurlu olduğu kanıtlanmıştır. Onlardan kaçının.
Java 8 ve üstü bu eski sınıfları yeni java.time çerçevesiyle tamamlar. Bkz. Öğretici . Joda-Time'dan esinlenilen ve ThreeTen-Extra projesi ile genişletilen JSR 310 tarafından tanımlanmıştır . ThreeTen-Backport projesi, sınıfları Java 6 ve 7'ye geri bağlar; ThreeTenABP projesi Android için.
Soru belirsizdir, sadece tarih mi yoksa tarih zamanı mı istediği açık değildir.
LocalDateYalnızca tarih için, günün saati olmadan, LocalDatesınıfı kullanın . "Bugün" gibi bir tarihin belirlenmesinde çok önemli bir saat dilimi olduğunu unutmayın.
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );
ZonedDateTimeBir tarih-zaman demek, o zaman kullanmak Instantiçinde çizelgesi üzerinde bir an olsun sınıfını UTC . Oradan, bir ZonedDateTimenesneyi almak için bir saat dilimine ayarlayın .
Instant now = Instant.now(); // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );
Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date, Calendar& SimpleDateFormat.
Artık bakım modunda olan Joda-Time projesi java.time sınıflarına geçişi tavsiye ediyor .
Daha fazla bilgi için Oracle Eğiticisine bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .
Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. JDBC 4.2 veya sonraki bir sürümüyle uyumlu bir JDBC sürücüsü kullanın . Dizeye gerek yok, sınıflara gerek yok .java.sql.*
Java.time sınıflarını nereden edinebilirsiniz?
ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için bir kanıt zeminidir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .
int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);
edit: ayrıştırıcı Javadoc bağlantısı gibi görünmüyor, bu yüzden burada düz metin:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#add(int , int)
Bunun yerine kendi yazma addDaysEli önerdiği gibi, ben kullanmayı tercih ediyorum DateUtilsdan Apache . Özellikle projenizde birden fazla yer kullanmanız gerektiğinde kullanışlıdır.
API diyor ki:
addDays(Date date, int amount)
Bir tarihe yeni bir nesne döndüren birkaç gün ekler.
Yeni bir Datenesne döndürdüğünü ve bir öncekinin kendisinde değişiklik yapmadığını unutmayın.
Aşağıdaki ile kolayca yapılabilir
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çok daha basit ve daha uygundur.
Birisi Joda Time'ı tavsiye etti - bu CalendarDate sınıfını kullanıyorum http://calendardate.sourceforge.net
Joda Time için biraz rakip bir proje, ama sadece 2 sınıfta çok daha temel. Projemden daha büyük bir paket kullanmak istemediğim için çok kullanışlı ve ihtiyacım olan şey için harika çalıştı. Java muadillerinden farklı olarak, en küçük birimi gündür, bu yüzden gerçekten bir tarihtir (milisaniyeye veya başka bir şeye sahip olmamak). Tarihi oluşturduktan sonra, çıkartmak için yaptığınız tek şey 5 gün geri dönmek için myDay.addDays (-5) gibi bir şeydir. Haftanın gününü ve bunun gibi şeyleri bulmak için kullanabilirsiniz. Başka bir örnek:
CalendarDate someDay = new CalendarDate(2011, 10, 27);
CalendarDate someLaterDay = today.addDays(77);
Ve:
//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 sınıfı kullanılarak herhangi bir zaman biriminin (ay, gün, saat, dakika, saniye, ...) çıkarılması veya eklenmesinin temiz ve güzel bir yolunun elde edilebileceğine inanıyorum .
Geçerli saatten 5 gün çıkarmak ve sonucu Tarih olarak almak için örnek:
new Date(Instant.now().minus(5, ChronoUnit.DAYS).toEpochMilli());
1 saat çıkarmak ve 15 dakika eklemek için başka bir örnek:
Date.from(Instant.now().minus(Duration.ofHours(1)).plus(Duration.ofMinutes(15)));
Daha fazla doğruluğa ihtiyacınız varsa, Instance nanosaniyeye kadar ölçüm yapar. Nanosaniye kısmını manipüle eden yöntemler:
minusNano()
plusNano()
getNano()
Ayrıca, Tarihin Anında Arama kadar doğru olmadığını unutmayın.
Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
Eli Courtwright ikinci çözümü yanlış, şöyle olmalı:
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());
addDays; onun çözümü doğrudur. Tarihten gün çıkarmak istiyorsanız, için negatif bir değer iletirsiniz days.
java.util.Calendarşimdi eski supplanted, java.time sınıfları. Oracle'ın Öğreticisine bakın .