Date in =newDate();LocalDateTime ldt =LocalDateTime.ofInstant(in.toInstant(),ZoneId.systemDefault());Date out =Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
@JigarJoshi byłoby wspaniale, gdybyś zaktualizował swoją odpowiedź za pomocą API Java 8. Twoja odpowiedź jest zaakceptowana, którą ludzie widzą jako pierwsza.
jotaen
47
@JigarJoshi to dobra odpowiedź i oczywiście @Tim zalecenie do użycia. czas joda .
Chcę tylko dodać więcej możliwości odejmowania dni od a java.util.Date.
Date dateBefore30Days =DateUtils.addDays(newDate(),-30);
Oczywiście dodaj commons-langzależność, aby robić tylko odejmowanie daty, prawdopodobnie nie jest to dobra opcja, jednak jeśli już używasz commons-lang, jest to dobry wybór. Istnieje również dogodne formy do addYears, addMonths, addWeeksi tak dalej, warto zapoznać się z API tutaj .
Nie ma sensu używać LocalDateTimetej klasy celowo, ponieważ nie ma pojęcia strefy czasowej ani przesunięcia względem UTC. Użyj tego tylko wtedy, gdy strefa / przesunięcie jest nieznane lub nieistotne. Zamiast tego użyj LocalDatei przekaż a ZoneIdpodczas wywoływania jego nowmetody. Zobacz poprawną odpowiedź Jacoba van Lingena.
Basil Bourque
1
@BasilBourque Po twojej radzie sprawdzam interfejs API i masz całkowitą rację, dlatego aktualizuję odpowiedź. dzięki.
albciff
Brian Montellano chciałby komentarza: nie powinno być żadnych sw DateUtils, to po prostu DateUtil.
Ole VV
@ OleV.V. Brian Montellano się myli, możesz sprawdzić DateUtilsdokumenty
albciff
33
Po prostu użyj tego, aby uzyskać datę sprzed 300 dni, zamień 300 na swoje dni:
Date date =newDate();// Or where ever you get it fromDate daysAgo =newDateTime(date).minusDays(300).toDate();
Muszę mieć na myśli API Java 8, a nie 7. Wspomnienie o pakiecie java.timemoże pomóc. Ponadto ogólnie oczekuje się dyskusji / wyjaśnień na temat przepełnienia stosu, a nie tylko fragmentu kodu. Zdecydowanie powinieneś to wyjaśnić, Durationponieważ jest to wartość dodana Twojej odpowiedzi w stosunku do istniejącej autorstwa van Lingena .
Basil Bourque
Przyczyna Java 8, naprawiona
Grigorij Kislin
tak blisko, ale powinno służyć do modyfikowania dowolnego obiektu daty, a nie „teraz”
bharal
9
Jak widać TUTAJ , jest wiele możliwości manipulacji. Oto przykład pokazujący, co możesz zrobić!
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
*/
Sugeruję zawsze przekazywanie opcjonalnej strefy czasowej (lub przesunięcia od UTC) do tej nowmetody. W przypadku pominięcia bieżąca domyślna strefa czasowa maszyny JVM jest stosowana niejawnie i dyskretnie. To ustawienie domyślne jest poza Twoją kontrolą i może ulec zmianie w dowolnym momencie, nawet podczas działania. Przykład: LocalDate.now( ZoneId.of( "America/Montreal" ).
Basil Bourque
musi znajdować się w obiekcie o dowolnej dacie zgodnie z pytaniem, a nie „teraz”
bharal
1
Stworzyłem funkcję ułatwiającą zadanie.
Przez 7 dni od daty Ciąg: dateCalculate(dateString,"yyyy-MM-dd",7);
Aby uzyskać aktualizację przez 7 dni, ciąg: 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());}
Pytanie dotyczy obiektów daty i godziny, a nie generowania ciągów. Nawiasem mówiąc, LocalDate.parse( "2017-01-23").plusWeeks( 1 )jest prostsze niż pisanie własnej metody i jest bardziej samodokumentujące.
Basil Bourque
0
Możesz łatwo odejmować za pomocą kalendarza z SimpleDateFormat
java.util.Date
obecnie starsze , zastąpione przez klasy java.time .Odpowiedzi:
Java 8 i nowsze
Wraz ze zmianą interfejsu API daty i godziny Java 8 użyj
LocalDate
Podobnie możesz mieć
Zobacz https://stackoverflow.com/a/23885950/260990, aby znaleźć tłumaczenie między java.util.Date <--> java.time.LocalDateTime
Java 7 i starsze
Wykorzystaniu koniecznie
Calendar
„Sadd()
Sposóbźródło
java.util.Date
,java.util.Calendar
ijava.text.SimpleTextFormat
są teraz spuścizny , wyparta przez java.time klas. Zobacz samouczek firmy Oracle .@JigarJoshi to dobra odpowiedź i oczywiście @Tim zalecenie do użycia. czas joda .
Chcę tylko dodać więcej możliwości odejmowania dni od a
java.util.Date
.Apache-commons
Jedną z możliwości jest użycie apache-commons-lang . Możesz to zrobić
DateUtils
w następujący sposób:Oczywiście dodaj
commons-lang
zależność, aby robić tylko odejmowanie daty, prawdopodobnie nie jest to dobra opcja, jednak jeśli już używaszcommons-lang
, jest to dobry wybór. Istnieje również dogodne formy doaddYears
,addMonths
,addWeeks
i tak dalej, warto zapoznać się z API tutaj .Java 8
Inną możliwością jest skorzystanie z nowości
LocalDate
z Java 8 przy użyciuminusDays(long days)
metody:źródło
LocalDateTime
tej klasy celowo, ponieważ nie ma pojęcia strefy czasowej ani przesunięcia względem UTC. Użyj tego tylko wtedy, gdy strefa / przesunięcie jest nieznane lub nieistotne. Zamiast tego użyjLocalDate
i przekaż aZoneId
podczas wywoływania jegonow
metody. Zobacz poprawną odpowiedź Jacoba van Lingena.s
wDateUtils
, to po prostuDateUtil
.DateUtils
dokumentyPo prostu użyj tego, aby uzyskać datę sprzed 300 dni, zamień 300 na swoje dni:
Tutaj,
DateTime
jestorg.joda.time.DateTime;
Date
jestjava.util.Date
źródło
Java 8 Time API:
źródło
java.time
może pomóc. Ponadto ogólnie oczekuje się dyskusji / wyjaśnień na temat przepełnienia stosu, a nie tylko fragmentu kodu. Zdecydowanie powinieneś to wyjaśnić,Duration
ponieważ jest to wartość dodana Twojej odpowiedzi w stosunku do istniejącej autorstwa van Lingena .Jak widać TUTAJ , jest wiele możliwości manipulacji. Oto przykład pokazujący, co możesz zrobić!
źródło
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .Dzięki Javie 8 jest to teraz naprawdę proste:
Świetny przewodnik po nowym interfejsie API można znaleźć tutaj .
źródło
now
metody. W przypadku pominięcia bieżąca domyślna strefa czasowa maszyny JVM jest stosowana niejawnie i dyskretnie. To ustawienie domyślne jest poza Twoją kontrolą i może ulec zmianie w dowolnym momencie, nawet podczas działania. Przykład:LocalDate.now( ZoneId.of( "America/Montreal" )
.Stworzyłem funkcję ułatwiającą zadanie.
Przez 7 dni od daty Ciąg:
dateCalculate(dateString,"yyyy-MM-dd",7);
Aby uzyskać aktualizację przez 7 dni, ciąg:
dateCalculate(dateString,"yyyy-MM-dd",-7);
źródło
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
że są teraz Legacy , wyparta przez java.time klas. Zobacz samouczek firmy Oracle .LocalDate.parse( "2017-01-23").plusWeeks( 1 )
jest prostsze niż pisanie własnej metody i jest bardziej samodokumentujące.Możesz łatwo odejmować za pomocą kalendarza z SimpleDateFormat
źródło
źródło