Date in =newDate();LocalDateTime ldt =LocalDateTime.ofInstant(in.toInstant(),ZoneId.systemDefault());Date out =Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
@JigarJoshi Es wäre großartig, wenn Sie Ihre Antwort mit der Java 8-API aktualisieren würden. Ihre Antwort ist die akzeptierte, die die Leute zuerst sehen.
Jotaen
47
@JigarJoshi es ist die gute Antwort und natürlich auch @ Tim Empfehlung zu verwenden. Joda-Zeit .
Ich möchte nur weitere Möglichkeiten hinzufügen, um Tage von a zu subtrahieren java.util.Date.
Date dateBefore30Days =DateUtils.addDays(newDate(),-30);
Natürlich fügen Sie die commons-langAbhängigkeit hinzu, um nur das Datum zu subtrahieren. Dies ist wahrscheinlich keine gute Option. Wenn Sie sie jedoch bereits verwenden commons-lang, ist dies eine gute Wahl. Es gibt auch praktische Möglichkeiten zu addYears, addMonths, addWeeksund so weiter, einen Blick auf die nehmen hier api .
Java 8
Eine andere Möglichkeit besteht darin, die Vorteile LocalDatevon Java 8 mithilfe der folgenden minusDays(long days)Methode zu nutzen:
Es macht keinen Sinn, LocalDateTimediese Klasse absichtlich zu verwenden, da sie weder ein Konzept der Zeitzone noch einen Versatz von UTC hat. Verwenden Sie dies nur, wenn Zone / Versatz unbekannt oder nicht relevant ist. Verwenden Sie stattdessen a LocalDateund übergeben Sie es, ZoneIdwenn Sie die nowMethode aufrufen . Siehe die richtige Antwort von Jacob van Lingen.
Basil Bourque
1
@BasilBourque Nach deinem Rat überprüfe ich die API und du hast vollkommen recht, daher aktualisiere ich die Antwort. Vielen Dank.
Albciff
Brian Montellano würde Kommentar mag: es nicht sein sollte , sin DateUtils, es ist nur DateUtil.
Ole VV
@ OleV.V. Brian Montellano ist falsch, Sie können die DateUtilsDokumente überprüfen
Albciff
33
Verwenden Sie dies einfach, um ein Datum vor 300 Tagen zu erhalten, und ersetzen Sie 300 durch Ihre Tage:
Date date =newDate();// Or where ever you get it fromDate daysAgo =newDateTime(date).minusDays(300).toDate();
Ich muss Java 8 API meinen, nicht 7. Und das Erwähnen des Pakets java.timekönnte helfen. Außerdem wird im Allgemeinen eine Diskussion / Erklärung zum Stapelüberlauf erwartet und nicht nur ein Code-Snippet. Sie sollten auf jeden Fall erklären Duration, dass dies der Mehrwert Ihrer Antwort gegenüber der bestehenden von van Lingen ist .
Basil Bourque
Java 8 der Ursache, behoben
Grigory Kislin
so nah, sollte aber zum Ändern eines beliebigen
Datumsobjekts dienen
9
Wie Sie HIER sehen können, können Sie viel manipulieren. Hier ein Beispiel, das zeigt, was Sie tun können!
DateFormat dateFormat =newSimpleDateFormat("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
*/
Ich schlage vor, immer die optionale Zeitzone (oder den Versatz von UTC) an diese nowMethode zu übergeben. Wenn nicht angegeben, wird die aktuelle Standardzeitzone der JVM implizit und stillschweigend angewendet. Dass Standard liegt außerhalb Ihrer Kontrolle und kann sich jederzeit ändern, auch während der Laufzeit. Beispiel : LocalDate.now( ZoneId.of( "America/Montreal" ).
Basil Bourque
muss sich auf einem beliebigen
Datumsobjekt
1
Ich habe eine Funktion erstellt, um die Aufgabe zu vereinfachen.
Für 7 Tage nach dateString: dateCalculate(dateString,"yyyy-MM-dd",7);
Um 7 Tage auf dem neuesten Stand zu seinString: dateCalculate(dateString,"yyyy-MM-dd",-7);
publicstaticString dateCalculate(String dateString,String dateFormat,int days){Calendar cal =Calendar.getInstance();SimpleDateFormat s =newSimpleDateFormat(dateFormat);try{
cal.setTime(s.parse(dateString));}catch(ParseException e){
e.printStackTrace();}
cal.add(Calendar.DATE, days);return s.format(cal.getTime());}
Die Frage umfasst Datums- / Uhrzeitobjekte, die keine Zeichenfolgen generieren. Übrigens LocalDate.parse( "2017-01-23").plusWeeks( 1 )ist einfacher als das Schreiben einer eigenen Methode und selbstdokumentierender.
Basil Bourque
0
Mit SimpleDateFormat können Sie ganz einfach mit dem Kalender subtrahieren
java.util.Date
jetzt Legacy sind , werden durch die Klassen java.time ersetzt .Antworten:
Java 8 und höher
Mit der Änderung der Datums- und Uhrzeit-API von Java 8 verwenden Sie
LocalDate
Ebenso können Sie haben
Unter https://stackoverflow.com/a/23885950/260990 finden Sie eine Übersetzung zwischen java.util.Date <--> java.time.LocalDateTime
Java 7 und früher
Verwenden Sie
Calendar
dieadd()
Methode vonquelle
java.util.Date
,java.util.Calendar
undjava.text.SimpleTextFormat
sind jetzt Erbe , durch die verdrängte java.time Klassen. Siehe Tutorial von Oracle .@JigarJoshi es ist die gute Antwort und natürlich auch @ Tim Empfehlung zu verwenden. Joda-Zeit .
Ich möchte nur weitere Möglichkeiten hinzufügen, um Tage von a zu subtrahieren
java.util.Date
.Apache-Commons
Eine Möglichkeit ist die Verwendung von apache-commons-lang . Sie können dies
DateUtils
folgendermaßen tun :Natürlich fügen Sie die
commons-lang
Abhängigkeit hinzu, um nur das Datum zu subtrahieren. Dies ist wahrscheinlich keine gute Option. Wenn Sie sie jedoch bereits verwendencommons-lang
, ist dies eine gute Wahl. Es gibt auch praktische Möglichkeiten zuaddYears
,addMonths
,addWeeks
und so weiter, einen Blick auf die nehmen hier api .Java 8
Eine andere Möglichkeit besteht darin, die Vorteile
LocalDate
von Java 8 mithilfe der folgendenminusDays(long days)
Methode zu nutzen:quelle
LocalDateTime
diese Klasse absichtlich zu verwenden, da sie weder ein Konzept der Zeitzone noch einen Versatz von UTC hat. Verwenden Sie dies nur, wenn Zone / Versatz unbekannt oder nicht relevant ist. Verwenden Sie stattdessen aLocalDate
und übergeben Sie es,ZoneId
wenn Sie dienow
Methode aufrufen . Siehe die richtige Antwort von Jacob van Lingen.s
inDateUtils
, es ist nurDateUtil
.DateUtils
Dokumente überprüfenVerwenden Sie dies einfach, um ein Datum vor 300 Tagen zu erhalten, und ersetzen Sie 300 durch Ihre Tage:
Hier,
DateTime
istorg.joda.time.DateTime;
Date
istjava.util.Date
quelle
Java 8 Time API:
quelle
java.time
könnte helfen. Außerdem wird im Allgemeinen eine Diskussion / Erklärung zum Stapelüberlauf erwartet und nicht nur ein Code-Snippet. Sie sollten auf jeden Fall erklärenDuration
, dass dies der Mehrwert Ihrer Antwort gegenüber der bestehenden von van Lingen ist .Wie Sie HIER sehen können, können Sie viel manipulieren. Hier ein Beispiel, das zeigt, was Sie tun können!
quelle
java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
sind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .Mit Java 8 ist es jetzt ganz einfach:
Eine großartige Anleitung zur neuen API finden Sie hier .
quelle
now
Methode zu übergeben. Wenn nicht angegeben, wird die aktuelle Standardzeitzone der JVM implizit und stillschweigend angewendet. Dass Standard liegt außerhalb Ihrer Kontrolle und kann sich jederzeit ändern, auch während der Laufzeit. Beispiel :LocalDate.now( ZoneId.of( "America/Montreal" )
.Ich habe eine Funktion erstellt, um die Aufgabe zu vereinfachen.
Für 7 Tage nach dateString:
dateCalculate(dateString,"yyyy-MM-dd",7);
Um 7 Tage auf dem neuesten Stand zu seinString:
dateCalculate(dateString,"yyyy-MM-dd",-7);
quelle
java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
das ist jetzt Erbe , durch die verdrängte java.time Klassen. Siehe Tutorial von Oracle .LocalDate.parse( "2017-01-23").plusWeeks( 1 )
ist einfacher als das Schreiben einer eigenen Methode und selbstdokumentierender.Mit SimpleDateFormat können Sie ganz einfach mit dem Kalender subtrahieren
quelle
quelle