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_MONTH
gibi aylar arasında ruloyu işlemeyeceği için bu durumda kullanmazsınız . Calendar.DAY_OF_YEAR
Bunun yerine kullanın
add
Yöntemi kullanabilir ve negatif bir sayı iletebilirsiniz. Ancak, Calendar
aş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 Date
tamamen 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 .Calendar
zahmetli, 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.
LocalDate
Yalnızca tarih için, günün saati olmadan, LocalDate
sı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 );
ZonedDateTime
Bir tarih-zaman demek, o zaman kullanmak Instant
içinde çizelgesi üzerinde bir an olsun sınıfını UTC . Oradan, bir ZonedDateTime
nesneyi 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 addDays
Eli önerdiği gibi, ben kullanmayı tercih ediyorum DateUtils
dan 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 Date
nesne 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 .