Java Tarih kesim saati bilgisi


121

Tarih ve saat bilgilerini içeren bir Java Date nesnem var. Zaman bilgisini kesen, saat-dakika-saniye kesen bir yöntem yazmak istiyorum, böylece sadece tarihim kaldı.

Örnek giriş:

2008-01-01 13:15:00

Beklenen çıktı:

2008-01-01 00:00:00

Bir ipucun var mı? Bunun gibi bir şey yapmayı denedim:

(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)

ancak saat dilimiyle ilgili sorunlarla karşılaştım.

Yanıtlar:


178

Tavsiye tarih / saat manipülasyon yapmanın yolu bir kullanmaktır Calendarnesne:

Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(dateObject);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long time = cal.getTimeInMillis();

2
@cletus, Date nesnesinden saati kaldırmak mümkün mü. 2008-01-01 gibi zaman bölümü olmayan saf tarih istiyorum.
Prem

2
Java.util.Calendar tavsiye edilir demem. Sun / Oracle, Java 8'deki bu sınıfın yerini yeni java.time paketiyle değiştirdi. Ya onu ya da Joda-Time'ı kullanın.
Basil Bourque

3
Takvim artık önerilmiyor. Java 8 kullanıyorsanız stackoverflow.com/a/28868089/40064 sayfasına bakın .
Wim Deblauwe

2
Bilginize, java.time sınıfları tarafından değiştirilen java.util.Calendar, artık miras kalan , zahmetli eski tarih-saat sınıfları. Oracle'ın Eğitimi bölümüne bakın .
Basil Bourque

149

Baktığınız DateUtils Apache Commons Lang kesiğinin yöntemiyle?

Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE);

zaman öğesini kaldıracak.


9
Bağlantı tekrar güncellendi (Apache'ye gelin! Dokümanlarınızı
taşımayı bırakın

6
Bu yaklaşımın eksi, hangi kesik işlemin gerçekleştirildiği zaman diliminin her zaman yerel PC saat dilimidir. Bu nedenle, UTC saat diliminde veya yerel saat dilimi dışında herhangi bir saat diliminde takvim ve tarihlerle çalışıyorsanız, tarihi amaçlandığı gibi kesmeyebilir.
Bulut

@Cloud'un da belirttiği gibi, burada Takvim örneğini görmemem (üzerinde kontrolüm yok) beni biraz
endişelendiriyor

Bu yöntem şaşırtıcı derecede uzun ve en az iki hata düzeltmesi vardı.
Pino

42

Joda'ya baktın mı ? Bu bir var çok tarihleri ve saatleri ile çalışmak daha kolay ve daha sezgisel bir yol. Örneğin, (diyelim ki) LocalDateTime ve LocalDate nesneleri arasında önemsiz bir şekilde dönüştürebilirsiniz .

örneğin (API'yi göstermek için)

LocalDate date = new LocalDateTime(milliseconds).toLocalDate()

Ek olarak, tarih / saat biçimlendiricileriyle bazı iş parçacığı güvenliği sorunlarını çözer ve Java'daki herhangi bir tarih / saat sorunuyla çalışmak için şiddetle tavsiye edilir.


12
Ben öyle olduğuna inanıyorum. Bozuk java.util sınıflarıyla savaşmak yerine daha iyi bir kütüphane kullanmanız önerilir (sorudan da anlaşılacağı gibi)
Brian Agnew

10
Elbette Joda, Java'da tarih, saat ve takvim manipülasyonu için bir kütüphanedir. Tavsiye etmemek bir görev ihmali olur.
Joel

1
İş parçacığı güvenlik sorunu çok ilginç, bu yazıyı bir Oracle / Hibernate hatasını "IllegalArgumentException, sun.util.calendar.ZoneInfo.getOffset (ZoneInfo), oracle.jdbc.driver.DateCommonBinder.zoneOffset (OraclePreparedStatement)" araştırırken buldum. Bu, yalnızca ağır yüklü forumlarda ortaya çıkan başka bir Oracle sorunundan bahsediyor . Benim için, Oracle'ın muhtemelen şüpheli joda olmayan şeyleri kullanmasına izin vermek yerine, Joda kullanarak iş parçacığımda aşağı ineceğimi düşünüyorum.
Mark Bennett

4
Keşke buna olumlu oy veren herkesi olumsuz oylayabilseydim. Soruyu yanıtlamaya bile çalışmayan bir yanıtı + 1'leyen bu insanlar kim? Joda'yı kullanarak bir cevap memnuniyetle karşılanacaktır, ama bu öyle değil ...
Ryan

1
@Ryan Bu cevap nasıl alakalı değil? Soru, günün saati belirtilmeden tarihi sordu. Bu cevap, tek amacı günün saati olmayan bir tarihi temsil eden bir sınıfı sunar.
Basil Bourque

35

Java 8 ve sonraki sürümlerinde yerleşik olan java.time sınıflarının ışığında hızlı bir güncelleme .

LocalDateTimetruncatedToburada konuştuklarınızı etkili bir şekilde ele alan bir yönteme sahiptir :

LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES)

Bu, geçerli zamanı yalnızca dakikalara kadar ifade edecektir:

2015-03-05T11:47

Kesmeyi yürütmek için DAYS'den daha küçük bir ChronoUnit(veya a TemporalUnit) kullanabilirsiniz (çünkü kesme, tarih bölümüne değil, yalnızca LocalDateTime'ın saat bölümüne uygulanır).


3
Yalnızca DAYS'e kadar ChronoUnits'i kullanabilirsiniz - daha yüksek birimler bir istisna oluşturacaktır.
assylias

26
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
date = cal.getTime();

22

Joda ile beklenen tarihi kolayca alabilirsiniz.

2.7 sürümünden itibaren (belki de 2.2'den daha önceki bazı sürümlerden bu yana), bir yorumcunun belirttiği gibi, toDateMidnightlehine veya uygun şekilde adlandırılmış olması withTimeAtStartOfDay(),

DateTime.now().withTimeAtStartOfDay()

mümkün.

Daha güzel bir API'nin avantajı eklendi.

Eski sürümlerle şunları yapabilirsiniz:

new DateTime(new Date()).toDateMidnight().toDate()

6
Joda-Time'daki gece yarısıyla ilgili yöntemler ve sınıflar artık kullanımdan kaldırılmıştır. Geliştiriciler bunları kullanmamanızı tavsiye ediyor. Bunun yerine yöntemi kullanın withTimeAtStartOfDay.
Basil Bourque

İşaret ettiğin için teşekkürler Bunu dikkate almak için cevabı güncelledi.
h7r

toLocalDateZaman bileşeni bile olmayan bir nesneyi elde etmek için de kullanabilirsiniz .
Charles Wood

Bilginize, Joda-Time projesi şu anda bakım modunda ve ekip java.time sınıflarına geçişi tavsiye ediyor . Oracle'ın Eğitimi bölümüne bakın .
Basil Bourque

8

Kesmeyi yeni java8 API ile yaptım. Tuhaf bir şeyle karşılaştım ama genel olarak bu kesik ...

Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);

anahtar kelimeler: java.time, Java 8, LocalDateTime.truncatedTo ()
Alexander Taylor

1
Bu yanıt yalnızca UTC saat dilimi bağlamı için tarihler üretir.
Basil Bourque

6

Apache'nin DateUtils ürününü şu şekilde kullanın: truncate ile:

DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);

Bu, Tarihin (getTime) temsil ettiği UTC'de değil, yerel Saat Dilimi'nde kesilir.
epox

6

Zaman damgaları için:

timestamp -= timestamp % (24 * 60 * 60 * 1000)

3
Bu kodda küçük bir hata var - sol köşeli parantez doğru yerleştirilmemiş, zaman damgası olmalıdır - = timestamp% (24 * 60 * 60 * 1000). Bu, zaman bölümünü kesecek. Ve eminim ki bu yol, Caledar nesnesi oluşturmaktan ve onun yöntemleriyle oynamaktan ve hatta başka herhangi bir üçüncü taraf kitaplığını kullanmaktan daha yeterli olacaktır
Stan

2
Hayır, bu doğru çözüm DEĞİLDİR, DİKKAT. Bu, tarih değerini tabana yuvarlamakla aynıdır, yani 29 Mart zaman damgası için 28 Mart alabilirsiniz (yerel ayarlarınızda). Dolayısıyla, Takvim tabanlı çözümler (Apache'nin DateUtils'i de Takvim kullanır) tek yol
Drew

Bu, Gün ışığından yararlanma saati nedeniyle saat değiştiğinde de çalışmayacaktır.
Alexandru Severin

5

Java.util.Date JavaDocs'tan:

Tarih sınıfı, milisaniye hassasiyetiyle belirli bir anı temsil eder

ve java.sql.Date JavaDocs'tan:

SQL DATE tanımına uymak için, java.sql.Date örneği tarafından sarılmış milisaniye değerleri, örneğin ilişkili olduğu belirli saat diliminde saatler, dakikalar, saniyeler ve milisaniyeler sıfıra ayarlanarak 'normalize' edilmelidir. .

Bu nedenle, en iyi yaklaşım, zaman bölümüne ihtiyacınız yoksa java.sql.Date kullanmaktır.

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());

ve çıktı:

java.util.Date : Thu Apr 26 16:22:53 PST 2012
java.sql.Date  : 2012-04-26

4

tl; Dr.

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString()                                     // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.

2008-01-01T00: 00 + 01: 00 [Avrupa / Paris]

İstediğiniz biçimde bir Dize oluşturmak için bir DateTimeFormatter.

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format(                                        // Generate a String representing the object’s value.
    DateTimeFormatter.ISO_LOCAL_DATE_TIME       // Built-in predefined formatter close to what you want. 
)
.replace( "T" , " " )                           // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.

2008-01-01 00:00:00

ayrıntılar

Diğer Cevaplar doğrudur, ancak java.time çerçevesi tarafından artık modası geçmiş eski tarih-saat sınıflarını kullanın.

java.time

Java.time çerçevesi, Java 8 ve sonraki sürümlerde yerleşiktir. Java.time işlevinin çoğu Java 6 & 7'ye ( ThreeTen-Backport ) geri taşınır ve ayrıca Android'e ( ThreeTenABP ) uyarlanır .

Önce giriş dizesini ISO 8601 biçiminin kanonik sürümüyle uyumlu olacak şekilde değiştirin. Standart ISO 8601 biçimleri, java.time sınıflarında varsayılan olarak tarih-saat değerlerini temsil eden dizeleri ayrıştırmak / oluşturmak için kullanılır. Ortadaki SPACE'i a ile değiştirmemiz gerekiyor T.

String input = "2008-01-01 13:15:00".replace( " " , "T" );  // → 2008-01-01T13:15:00

Şimdi LocalDateTime, "Yerel" ifadesinin belirli bir yer olmadığı anlamına geldiği bir şekilde ayrıştırabiliriz . Girişte herhangi bir UTC'den uzaklık veya saat dilimi bilgisi yok.

LocalDateTime ldt = LocalDateTime.parse( input );

ldt.toString ()… 2008-01-01T13: 15: 00

Günün saatini veya saat dilimini önemsemiyorsanız, bir LocalDate.

LocalDate ld = ldt.toLocalDate();

ld.toString ()… 2008-01-01

Günün İlk Anı

Bunun yerine günün saatinin günün ilk anına ayarlanmasını istiyorsanız, bir ZonedDateTimesınıf kullanın , ardından yöntemini LocalDateçağırmak için bir nesneye dönüştürün atStartOfDay. 00:00:00Yaz Saati Uygulaması veya başka anormallikler nedeniyle ilk anın zamanı olmayabileceğini unutmayın .

Saat dilimi çok önemlidir çünkü herhangi bir an için tarih dünyanın her yerinde bölgeye göre değişir. Örneğin, Paris'te gece yarısından birkaç dakika sonra Parisliler için yeni bir gün, ancak Kanadalılar için Montréal'de hala "dün".

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );

zdtStartOfDay.toString ()… 2008-01-01T00: 00: 00-05: 00 [Amerika / Montreal]

UTC

O anı UTC saat diliminin merceğinden görmek için bir Instantnesne çıkarın . Hem ve ZonedDateTimehem Instantde zaman çizelgesinde aynı anı temsil edecek, ancak iki farklı duvar saati olarak görünecektir .

An Instant, java.time'daki temel yapı taşı sınıfıdır, tanımı gereği her zaman UTC'dir. Genel olarak iş mantığınızı, veri depolamanızı ve veri alışverişinizi UTC'de yapmanız gerektiği için bu sınıfı sık sık kullanın.

Instant instant = zdtStartOfDay.toInstant();

instant.toString ()… 2008-01-01T05: 00: 00Z

Gece yarısı inme yerine sabah 5'i görüyoruz. Standart formatta, Zsondaki kısadır Zuluve "UTC" anlamına gelir.


Hakkında java.time

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.

Şu anda bakım modunda olan Joda-Time projesi, java.time sınıflarına geçişi önerir .

Daha fazla bilgi edinmek için Oracle Eğitimi'ne bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Java.time nesnelerini doğrudan veritabanınız ile değiş tokuş edebilirsiniz . JDBC 4.2 veya üstü ile uyumlu bir JDBC sürücüsü kullanın . Dizelere gerek yok, derslere gerek yok .java.sql.*

Java.time sınıflarını nereden edinebilirim?

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için kanıtlayıcı bir zemindir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


2

Ve alanlarını sıfır olarak ayarlamak için Calendar sınıfının set()yöntemini kullanın .HOUR_OF_DAY, MINUTE, SECONDMILLISECOND


2

Soru çelişkili. Günün saati olmayan bir tarih ister, ancak saatli bir örnek görüntüler 00:00:00.

Joda-Time

GÜNCELLEME: Joda-Time projesi artık bakım moduna geçişi danışmanlık ekibi ile, java.time sınıfları. Java.time çözümü için diğer Cevabıma bakın .

Bunun yerine günün saatinin günün ilk anına ayarlanmasını istiyorsanız, DateTimeJoda-Time kitaplığındaki bir nesneyi kullanın ve withTimeAtStartOfDayyöntemini çağırın . 00:00:00Yaz Saati Uygulaması veya başka anormallikler nedeniyle ilk anın zamanı olmayabileceğini unutmayın .


Bu kesin cevaptır (Joda Zamanını kullanabileceğini ve kullanmak istediğini varsayarsak)
Clint Eastwood

2

Sadece clear()gereksiz alanlar.

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);
Date truncatedDate = calendar.getTime();

Java 8'den daha iyi bir seçenek , örneğin şu truncatedToyöntemi kullanmaktır LocalDateTime:

LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)

Bu işe yaramıyor çünkü calendar.clear(Calendar.HOUR_OF_DAY);saatleri temizlemiyor. @Cletus'un çözümü iyi çalışıyor.
Arcao

Üzgünüm, haklısınız, düzelttim, saatlerce değeri ayarlamalısınız. Genelde tarihin nasıl kesileceği neredeyse aynı ...
m190

1

Yeni "geliştirilmiş" takvim yapıcısının "berbat" eski Date gibi milisaniyeler için bir int almaması beni gerçekten sinirlendirdi. Sonra gerçekten sinirlendim ve şunu yazdım:

long stuffYou = startTime.getTimeInMillis() % 1000;
startTime.setTimeInMillis(startTime.getTimeInMillis() - stuffYou);

O zamanlar "malzeme" kelimesini kullanmadım ama sonra bunun mutluluğunu keşfettim:

startTime.set(Calendar.MILLISECOND, 0);

Ama yine de bu konuda oldukça kızgınım.


1

Sorunu şu şekilde düzelttim (Doğu sekiz bölgesinde (Pekin saati)):

private Date getTruncatedDate(Date d) {
    if (d == null) {
        return null;
    }
    long h = 60 * 60 * 1000L;
    long dateStamp = d.getTime() - (d.getTime() + 8 * h) % (24 * h);
    return new Date(dateStamp);
}

Her şeyden önce, zaman damgasının ne olduğu konusunda net olmalısınız. Zaman damgası, 01 Ocak 00:00:00 1970 GMT'den (UTC ile aynı) veya 01 Ocak 08:00:00 CST 1970'den bugüne kadar olan toplam milisaniyedir.

Unutmayın: Zaman damgası, saat diliminden bağımsızdır.

Böylece, farklı saat dilimlerinde aşağıdaki ifadeyle aynı sonucu elde edersiniz:

System.out.println(new Date().getTime());

Ve

System.out.println(new Date(0));

farklı zaman dilimlerinde farklı zaman bilgileri yazdırır: Bilgisayarınızın saat dilimini UTC olarak ayarlarsanız,

Thu Jan 01 00:00:00 UTC 1970

Ancak saat dilimini (UTC +8: 00) Beijing, Chongqing, HongKong, Urumq olarak ayarlarsanız şunları elde edersiniz:

Thu Jan 01 08:00:00 CST 1970

Java, zaman damgasını alır, ardından saat dilimine göre tarih ve saat bilgilerini görüntüler.

Java'nın farklı zaman dilimlerinde tarih ve saat bilgisini nasıl görüntülediğinin tanıtımı için, zaman bilgisinin nasıl değiştirileceği kolaydır. Zaman damgasını almalı ve saat bilgisini keserken saat dilimini hesaba katmalısınız. Ardından, kesim zaman damgası ile yeni bir Tarih nesnesi oluşturabilirsiniz (buna tarih damgası diyebiliriz), java, tarih bilgisini görüntülerken saat dilimini telafi edecektir.

Doğu sekiz bölgesinde (Pekin saati) olduğu gibi, Pekin saati GMT'den 8 saat daha erken, bu nedenle modulo işlemini yaptığınızda 8 saatten fazla çıkarmalısınız. Yani, önce GMT saatini almalısınız, ardından Java, bilgisayarınızın saat dilimi ayarına göre görüntüleme süresi olduğunda 8 saat ekleyecektir.


Saat dilimi sorunu belirsiz ve ayrıca uzun süre kafamı karıştırıyor. Şimdi netleştiriyorum. Umut yardımcı olur.


2018-01-04 Aşağıdaki yöntem de işe yarıyor.

private Date getTruncatedDate2(Date d) {
    Calendar cal = Calendar.getInstance(); // locale-specific
    cal.setTime(d);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);


return cal.getTime();

}


Bilginize, bu Yanıt, yıllar önce java.time sınıfları tarafından değiştirilen zahmetli eski tarih-saat sınıflarını kullanır .
Basil Bourque

1

Saat dilimi sorununu önlemek için bunu yapabilirsiniz:

public static Date truncDate(Date date) {
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    return cal.getTime();
}

Java Datenesnesi zaman damgası değeri olmasına rağmen , kesme sırasında yerel saat dilimine dönüştürülecektir, bu nedenle UTC saat diliminden bir değer bekliyorsanız şaşırtıcı bir değer elde edersiniz.


Zahmetli Calendarve Datesınıflar ile eski yıl önce oldu java.time sonra Java 8 ve JSR 310 uygulayan sınıflar. 2018'de kullanımlarını önermek kötü bir tavsiye.
Basil Bourque

0

Geç yanıt olabilir, ancak işte bunu herhangi bir kitaplık kullanmadan tek satırda yapmanın bir yolu:

new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(YOUR_TIMESTAMP))

0

İle Joda-Time sürüm 2.0 beri kullanabilirsiniz LocalDate.toDate().

basitçe

// someDatetime is whatever java.util.Date you have.
Date someDay = new LocalDate(someDatetime).toDate();

[A] Cevabınız gereksiz. Brian Agnew tarafından zaten yayınlandı . [B] Kodunuz yanlış, çünkü soruda ortaya atılan sorun saat dilimini yok sayıyor.
Basil Bourque

Gereksiz olabilir ama buraya daha basit bir örnek verdim çünkü yorumlarda bir cevabın olmaması gerektiğini fark ettim. Evet, java.util.Date TimeZone'u yok sayıyor ama asıl soru a Java Date objectbu yüzden kullandım java.util.Date. Dahası, saat diliminin java.util.Date ile (ne zaman? Nerede?) Dışında kullanmasına yardımcı olamasa da nasıl sorunlu olduğunu açıklamıyor Date.
lamusique

0

Takvim kullanan tüm cevaplar için bunun yerine bunu kullanmalısınız

public static Date truncateDate(Date date) {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.HOUR_OF_DAY, c.getActualMinimum(Calendar.HOUR_OF_DAY));
    c.set(Calendar.MINUTE, c.getActualMinimum(Calendar.MINUTE));
    c.set(Calendar.SECOND, c.getActualMinimum(Calendar.SECOND));
    c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND));
    return c.getTime();
}

Ama bunu tercih ederim:

public static Date truncateDate(Date date) {
    return new java.sql.Date(date.getTime());
}

java.sql.DateSınıf tarih salt değeri temsil süsü ama aslında bir süre günün-UTC saat dilimine göre ayarlanmış var. Yani Soru için gerçekten uygun bir çözüm değil.
Basil Bourque

0

Java 8+ kullanıyorsanız saat olmadan tarih almanın basit bir yolu: Date yerine java.time.LocalDate türünü kullanın.

LocalDate now = LocalDate.now();
 System.out.println(now.toString());

Çıktı:

2019-05-30

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html


1
Kullanmak LocalDateçoğu amaç için iyi bir fikirdir, ancak sorunun girdisiyle bunun nasıl çalışacağı belirsizdir 2008-01-01 13:15:00.
Ole VV
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.