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

Java SE 8

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)));
Java SE 8

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:

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ören new 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

  1. LocalTime time = LocalTime.now();
  2. time = LocalTime.MIDNIGHT;
  3. time = LocalTime.NOON;
  4. 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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow