Java Language
Datum klass
Sök…
Syntax
-
Date object = new Date();
-
Date object = new Date(long date);
parametrar
Parameter | Förklaring |
---|---|
Ingen parameter | Skapar ett nytt datumobjekt med tilldelningstiden (till närmaste millisekund) |
långt datum | Skapar ett nytt datumobjekt med tiden inställd på antalet millisekunder sedan "epoken" (1 januari 1970, 00:00:00 GMT) |
Anmärkningar
Representation
Internt representeras ett Java Date-objekt som ett långt; det är antalet millisekunder sedan en viss tid (kallas epoken ). Den ursprungliga Java Date-klassen hade metoder för att hantera tidszoner etc., men dessa avskrivs till förmån för den då nya kalenderklassen.
Så om allt du vill göra i din kod är att representera en viss tid, kan du skapa en datumklass och lagra den, etc. Om du vill skriva ut en mänsklig läsbar version av det datumet skapar du dock en kalenderklass och använda formateringen för att producera timmar, minuter, sekunder, dagar, tidszoner osv. Tänk på att ett specifikt millisekund visas som olika timmar i olika tidszoner; normalt vill du visa en i den "lokala" tidszonen, men formateringsmetoderna måste ta hänsyn till att du kanske vill visa den för någon annan.
Var också medveten om att de klockor som används av JVM: er vanligtvis inte har millisekundens noggrannhet; klockan kanske bara "kryssar" var tionde millisekund, och därför kan du inte lita på att mäta saker exakt på den nivån om du timar saker.
Importmeddelande
import java.util.Date;
Date
kan importeras från paketet java.util
.
Varning
Date
fall är föränderlig, så använder dem kan göra det svårt att skriva trådsäker kod eller kan oavsiktligt ge skrivåtkomst till inre tillstånd. I klassen nedan getDate()
metoden getDate()
den som ringer att ändra transaktionsdatumet:
public final class Transaction {
private final Date date;
public Date getTransactionDate() {
return date;
}
}
Lösningen är att antingen returnera en kopia av date
eller använda de nya API: erna i java.time
introducerad i Java 8.
De flesta konstruktormetoder i klassen Date
har skrivits ut och bör inte användas. I nästan alla fall är det tillrådligt att använda Calendar
för datumoperationer.
Java 8
Java 8 introducerar nytt tid och datum API i paketet java.time
, inklusive LocalDate och LocalTime . Klasserna i java.time
paketet java.time
ett översynligt API som är lättare att använda. Om du skriver till Java 8 uppmuntras det starkt att du använder detta nya API. Se Datum och tid (java.time. *) .
Skapa datumobjekt
Date date = new Date();
System.out.println(date); // Thu Feb 25 05:03:59 IST 2016
Här innehåller detta Date
aktuellt datum och tid då objektet skapades.
Calendar calendar = Calendar.getInstance();
calendar.set(90, Calendar.DECEMBER, 11);
Date myBirthDate = calendar.getTime();
System.out.println(myBirthDate); // Mon Dec 31 00:00:00 IST 1990
Date
skapas bäst genom en Calendar
eftersom användningen av datakonstruktörerna avskrivs och avskräcks. För att göra detta måste vi få en instans av Calendar
från fabriksmetoden. Sedan kan vi ställa in år, månad och dag i månad med hjälp av siffror eller i fall av månader konstanter som tillhandahålls py kalenderklassen för att förbättra läsbarheten och minska fel.
calendar.set(90, Calendar.DECEMBER, 11, 8, 32, 35);
Date myBirthDatenTime = calendar.getTime();
System.out.println(myBirthDatenTime); // Mon Dec 31 08:32:35 IST 1990
Tillsammans med datum kan vi också gå i timme, minuter och sekunder.
Jämför datumobjekt
Kalender, datum och LocalDate
före, efter, jämförTo och lika metoder
//Use of Calendar and Date objects
final Date today = new Date();
final Calendar calendar = Calendar.getInstance();
calendar.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date birthdate = calendar.getTime();
final Calendar calendar2 = Calendar.getInstance();
calendar2.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date samebirthdate = calendar2.getTime();
//Before example
System.out.printf("Is %1$tF before %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.before(birthdate)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", today, today, Boolean.valueOf(today.before(today)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.before(today)));
//After example
System.out.printf("Is %1$tF after %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(birthdate)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(today)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.after(today)));
//Compare example
System.out.printf("Compare %1$tF to %2$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(birthdate)));
System.out.printf("Compare %1$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(today)));
System.out.printf("Compare %2$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(birthdate.compareTo(today)));
//Equal example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.equals(birthdate)));
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", birthdate, samebirthdate,
Boolean.valueOf(birthdate.equals(samebirthdate)));
System.out.printf(
"Because birthdate.getTime() -> %1$d is different from samebirthdate.getTime() -> %2$d, there are millisecondes!%n",
Long.valueOf(birthdate.getTime()), Long.valueOf(samebirthdate.getTime()));
//Clear ms from calendars
calendar.clear(Calendar.MILLISECOND);
calendar2.clear(Calendar.MILLISECOND);
birthdate = calendar.getTime();
samebirthdate = calendar2.getTime();
System.out.printf("Is %1$tF equal to %2$tF after clearing ms? %3$b%n", birthdate, samebirthdate,
Boolean.valueOf(birthdate.equals(samebirthdate)));
isBefore, isAfter, CompareTo och lika metoder
//Use of LocalDate
final LocalDate now = LocalDate.now();
final LocalDate birthdate2 = LocalDate.of(2012, 6, 30);
final LocalDate birthdate3 = LocalDate.of(2012, 6, 30);
//Hours, minutes, second and nanoOfsecond can also be configured with an other class LocalDateTime
//LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
//isBefore example
System.out.printf("Is %1$tF before %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(birthdate2)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(now)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isBefore(now)));
//isAfter example
System.out.printf("Is %1$tF after %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(birthdate2)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(now)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isAfter(now)));
//compareTo example
System.out.printf("Compare %1$tF to %2$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(birthdate2)));
System.out.printf("Compare %1$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(now)));
System.out.printf("Compare %2$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(birthdate2.compareTo(now)));
//equals example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.equals(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.equals(birthdate3)));
//isEqual example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isEqual(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.isEqual(birthdate3)));
Datumjämförelse före Java 8
Före Java 8 kan datum jämföras med java.util.Calendar och java.util.Date klasser. Datumklassen erbjuder fyra metoder för att jämföra datum:
after
, before
, compareTo
och equals
metoder jämför de värden som returneras med getTime () -metoden för varje datum.
compareTo
metoden ger positivt heltal.
- Värde större än 0: när Datumet är efter Datum-argumentet
- Värde större än 0: när Datumet är före datumargumentet
- Värdet är lika med 0: när Datumet är lika med Datum-argumentet
equals
resultat kan vara överraskande som visas i exemplet eftersom värden, liksom millisekunder, inte initialiseras med samma värde om de inte uttryckligen ges.
Sedan Java 8
Med Java 8 finns ett nytt objekt att arbeta med Date tillgängligt java.time.LocalDate . LocalDate
implementerar ChronoLocalDate , den abstrakta representationen av ett datum där Chronology, eller kalendersystemet är pluggbart.
För att ha precisionsdatum måste objektet java.time.LocalDateTime användas. LocalDate
och LocalDateTime
använder samma metodnamn för att jämföra.
Att jämföra datum med en LocalDate
skiljer sig från att använda ChronoLocalDate
eftersom kronologin eller kalendersystemet inte beaktas det första.
Eftersom de flesta applikationer bör använda LocalDate
ingår inte ChronoLocalDate
i exempel. Läs mer här .
De flesta applikationer bör förklara metodsignaturer, fält och variabler som LocalDate, inte detta [ChronoLocalDate] -gränssnitt.
LocalDate
har 5 metoder för att jämföra datum:
- isAfter (ChronoLocalDate övrigt)
- isBefore (ChronoLocalDate övrigt)
- isEqual (ChronoLocalDate övrigt)
- jämförTo (ChronoLocalDate övrigt)
- lika med (Obj obj)
I fallet med LocalDate
parametern, isAfter
, isBefore
, isEqual
, equals
and compareTo
använder nu den här metoden:
int compareTo0(LocalDate otherDate) {
int cmp = (year - otherDate.year);
if (cmp == 0) {
cmp = (month - otherDate.month);
if (cmp == 0) {
cmp = (day - otherDate.day);
}
}
return cmp;
}
equals
metodkontroll om parameterns referens är först med datumet medan isEqual
direkt kallar compareTo0
.
Vid en annan ChronoLocalDate
av ChronoLocalDate
datumen med Epoch Day
. Epokdagens räkning är ett enkelt ökande antal dagar där dag 0 är 1970-01-01 (ISO).
Konvertera datum till ett visst strängformat
format()
från klassen SimpleDateFormat
hjälper till att konvertera ett Date
objekt till ett visst format String
objekt med hjälp av den medföljande mönstringssträngen .
Date today = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yy"); //pattern is specified here
System.out.println(dateFormat.format(today)); //25-Feb-16
Mönster kan appliceras igen med hjälp av applyPattern()
dateFormat.applyPattern("dd-MM-yyyy");
System.out.println(dateFormat.format(today)); //25-02-2016
dateFormat.applyPattern("dd-MM-yyyy HH:mm:ss E");
System.out.println(dateFormat.format(today)); //25-02-2016 06:14:33 Thu
Obs: Här betecknar mm
(liten bokstav m) minuter och MM
(kapital M) anger månad. Var uppmärksam när du formaterar år: storleken "Y" ( Y
) indikerar "veckan i året" medan små bokstäver "y" ( y
) anger året.
Konvertera sträng till datum
parse()
från klassen SimpleDateFormat
hjälper till att konvertera ett String
till ett Date
.
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
String dateStr = "02/25/2016"; // input String
Date date = dateFormat.parse(dateStr);
System.out.println(date.getYear()); // 116
Det finns fyra olika stilar för textformatet, SHORT
, MEDIUM
(detta är standard), LONG
och FULL
, som alla beror på landskapet. Om inget landsmärke anges används systeminställningen.
Stil | Locale.US | Locale.France |
---|---|---|
KORT | 6/30/09 | 30/06/09 |
MEDIUM | 30 juni 2009 | 30 juni 2009 |
LÅNG | 30 juni 2009 | 30 juni 2009 |
FULL | Tisdagen den 30 juni 2009 | mardi 30 juni 2009 |
En grunddatumutgång
Med hjälp av följande kod med formatsträngen yyyy/MM/dd hh:mm.ss
får vi följande utgång
2016/04/19 11: 45.36
// define the format to use
String formatString = "yyyy/MM/dd hh:mm.ss";
// get a current date object
Date date = Calendar.getInstance().getTime();
// create the formatter
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatString);
// format the date
String formattedDate = simpleDateFormat.format(date);
// print it
System.out.println(formattedDate);
// single-line version of all above code
System.out.println(new SimpleDateFormat("yyyy/MM/dd hh:mm.ss").format(Calendar.getInstance().getTime()));
Konvertera formaterad strängrepresentation av datum till datumobjekt
Den här metoden kan användas för att konvertera en formaterad strängrepresentation av ett datum till ett Date
.
/**
* Parses the date using the given format.
*
* @param formattedDate the formatted date string
* @param dateFormat the date format which was used to create the string.
* @return the date
*/
public static Date parseDate(String formattedDate, String dateFormat) {
Date date = null;
SimpleDateFormat objDf = new SimpleDateFormat(dateFormat);
try {
date = objDf.parse(formattedDate);
} catch (ParseException e) {
// Do what ever needs to be done with exception.
}
return date;
}
Skapa ett specifikt datum
Medan Java Date-klassen har flera konstruktörer kommer du att märka att de flesta är avskrivna. Det enda acceptabla sättet att skapa en datuminstans direkt är antingen genom att använda den tomma konstruktören eller passera i ett långt (antal millisekunder sedan standard bastid). Inte heller är praktiskt om du inte letar efter det aktuella datumet eller har en annan datuminstans redan i handen.
För att skapa ett nytt datum behöver du en kalenderinstans. Därifrån kan du ställa in kalenderinstansen till det datum du behöver.
Calendar c = Calendar.getInstance();
Detta returnerar en ny kalenderinstans inställd på aktuell tid. Kalendern har många metoder för att mutera sitt datum och tid eller ställa in det direkt. I det här fallet ställer vi in det på ett specifikt datum.
c.set(1974, 6, 2, 8, 0, 0);
Date d = c.getTime();
Metoden getTime
returnerar getTime
som vi behöver. Tänk på att kalenderuppsättningsmetoderna bara anger ett eller flera fält, de ställer inte in alla. Det vill säga om du ställer in året förblir de andra fälten oförändrade.
FÄLLA
I många fall uppfyller detta kodavsnitt dess syfte, men kom ihåg att två viktiga delar av datum / tid inte definieras.
-
(1974, 6, 2, 8, 0, 0)
-parametrarna tolkas inom standardtidszonen, definierade någon annanstans, - millisekunderna är inte inställda på noll, utan fylls från systemklockan vid den tidpunkt då kalenderinstansen skapas.
Java 8 LocalDate och LocalDateTime-objekt
Date- och LocalDate-objekt kan inte konverteras exakt mellan varandra eftersom ett Date-objekt representerar både en specifik dag och tid, medan ett LocalDate-objekt inte innehåller information om tid eller tidszon. Det kan dock vara användbart att konvertera mellan de två om du bara bryr dig om aktuell datuminformation och inte tidsinformationen.
Skapar en LocalDate
// Create a default date
LocalDate lDate = LocalDate.now();
// Creates a date from values
lDate = LocalDate.of(2017, 12, 15);
// create a date from string
lDate = LocalDate.parse("2017-12-15");
// creates a date from zone
LocalDate.now(ZoneId.systemDefault());
Skapar en LocalDateTime
// Create a default date time
LocalDateTime lDateTime = LocalDateTime.now();
// Creates a date time from values
lDateTime = LocalDateTime.of(2017, 12, 15, 11, 30);
// create a date time from string
lDateTime = LocalDateTime.parse("2017-12-05T11:30:30");
// create a date time from zone
LocalDateTime.now(ZoneId.systemDefault());
LocalDate to Date och vice versa
Date date = Date.from(Instant.now());
ZoneId defaultZoneId = ZoneId.systemDefault();
// Date to LocalDate
LocalDate localDate = date.toInstant().atZone(defaultZoneId).toLocalDate();
// LocalDate to Date
Date.from(localDate.atStartOfDay(defaultZoneId).toInstant());
LocalDateTime to Date och vice versa
Date date = Date.from(Instant.now());
ZoneId defaultZoneId = ZoneId.systemDefault();
// Date to LocalDateTime
LocalDateTime localDateTime = date.toInstant().atZone(defaultZoneId).toLocalDateTime();
// LocalDateTime to Date
Date out = Date.from(localDateTime.atZone(defaultZoneId).toInstant());
Tidszoner och java.util.Date
Ett java.util.Date
objekt har inte begreppet tidszon.
- Det finns inget sätt att ställa in en tidszon för ett datum
- Det finns inget sätt att ändra tidszonen för ett datumobjekt
- Ett datumobjekt skapat med den
new Date()
standardkonstruktörennew Date()
kommer att initialiseras med den aktuella tiden i systemets standardtidszon
Det är dock möjligt att visa datum representerat av den tidpunkt som beskrivs av datumobjektet i en annan tidszon med t.ex. java.text.SimpleDateFormat
:
Date date = new Date();
//print default time zone
System.out.println(TimeZone.getDefault().getDisplayName());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //note: time zone not in format!
//print date in the original time zone
System.out.println(sdf.format(date));
//current time in London
sdf.setTimeZone(TimeZone.getTimeZone("Europe/London"));
System.out.println(sdf.format(date));
Produktion:
Central European Time
2016-07-21 22:50:56
2016-07-21 21:50:56
Konvertera java.util.Date till java.sql.Date
java.util.Date
till java.sql.Date
konvertering är vanligtvis nödvändig när ett Date-objekt måste skrivas i en databas.
java.sql.Date
är ett omslag runt millisekundvärde och används av JDBC
att identifiera en SQL DATE
typ
I exemplet nedan använder vi java.util.Date()
-konstruktören, som skapar ett datumobjekt och initialiserar det för att representera tid till närmaste millisekund. Detta datum används i convert(java.util.Date utilDate)
för att returnera ett java.sql.Date
objekt
Exempel
public class UtilToSqlConversion {
public static void main(String args[])
{
java.util.Date utilDate = new java.util.Date();
System.out.println("java.util.Date is : " + utilDate);
java.sql.Date sqlDate = convert(utilDate);
System.out.println("java.sql.Date is : " + sqlDate);
DateFormat df = new SimpleDateFormat("dd/MM/YYYY - hh:mm:ss");
System.out.println("dateFormated date is : " + df.format(utilDate));
}
private static java.sql.Date convert(java.util.Date uDate) {
java.sql.Date sDate = new java.sql.Date(uDate.getTime());
return sDate;
}
}
Produktion
java.util.Date is : Fri Jul 22 14:40:35 IST 2016
java.sql.Date is : 2016-07-22
dateFormated date is : 22/07/2016 - 02:40:35
java.util.Date
har både java.util.Date
och tidsinformation, medan java.sql.Date
endast har java.sql.Date
Lokal tid
Använd LocalTime för att bara använda tidsdelen av ett datum. Du kan instansera ett LocalTime-objekt på ett par sätt
-
LocalTime time = LocalTime.now();
-
time = LocalTime.MIDNIGHT;
-
time = LocalTime.NOON;
-
time = LocalTime.of(12, 12, 45);
LocalTime
har också en inbyggd toString-metod som visar formatet mycket snyggt.
System.out.println(time);
du kan också få, lägga till och subtrahera timmar, minuter, sekunder och nanosekunder från LocalTime-objektet, dvs
time.plusMinutes(1);
time.getMinutes();
time.minusMinutes(1);
Du kan förvandla det till ett datumobjekt med följande kod:
LocalTime lTime = LocalTime.now();
Instant instant = lTime.atDate(LocalDate.of(A_YEAR, A_MONTH, A_DAY)).
atZone(ZoneId.systemDefault()).toInstant();
Date time = Date.from(instant);
denna klass fungerar mycket snyggt i en timerklasse för att simulera en väckarklocka.