bugün ve yarın gece yarısı Java Date nesnesi nasıl oluşturulur?


178

Kodumda bugün olan her şeyi bulmam gerekiyor. Bu yüzden bugünden 00:00 (bu sabah erken gece yarısı) ile 12:00 (gece yarısı) arasındaki tarihlerle karşılaştırmam gerekiyor.

Biliyorum ...

Date today = new Date(); 

... beni hemen yakaladı. Ve ...

Date beginning = new Date(0);

... bana 1 Ocak 1970'te sıfır zaman kazandırıyor. Ama bugün sıfır zaman ve yarın sıfır zaman almanın kolay yolu nedir?

GÜNCELLEME; Bunu yaptım, ama elbette daha kolay bir yol var mı?

Calendar calStart = new GregorianCalendar();
calStart.setTime(new Date());
calStart.set(Calendar.HOUR_OF_DAY, 0);
calStart.set(Calendar.MINUTE, 0);
calStart.set(Calendar.SECOND, 0);
calStart.set(Calendar.MILLISECOND, 0);
Date midnightYesterday = calStart.getTime();

Calendar calEnd = new GregorianCalendar();
calEnd.setTime(new Date());
calEnd.set(Calendar.DAY_OF_YEAR, calEnd.get(Calendar.DAY_OF_YEAR)+1);
calEnd.set(Calendar.HOUR_OF_DAY, 0);
calEnd.set(Calendar.MINUTE, 0);
calEnd.set(Calendar.SECOND, 0);
calEnd.set(Calendar.MILLISECOND, 0);
Date midnightTonight = calEnd.getTime();

3
Bence Joda Time daha kolay, cevabımın sonuna bakın. Eğer java.util.Date/Calendar kullanmak istiyorsanız, bunu yapmanın daha kolay bir yolu yoktur.
timaschew

RE: Joda-Time'ı kullanmak için timaschew yorumu, Joda-Time projesinin artık bakım modunda olduğunu biliyor ve java.time sınıflarına geçişi tavsiye ediyor.
Basil Bourque

1
Bilginize gibi korkunç zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time sonra Java 8 ve yerleşik sınıflara. Oracle'ın Öğreticisine bakın .
Basil Bourque

2
Bu konuda bir soruya çok sayıda kusurlu cevap görmek nadiren olur. Cevabı Basil Bourque tarafından tavsiye , doğru ve bilgili.
Ole VV

Yanıtlar:


344

java.util.Calendar

// today    
Calendar date = new GregorianCalendar();
// reset hour, minutes, seconds and millis
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);

// next day
date.add(Calendar.DAY_OF_MONTH, 1);

JDK 8 - java.time.LocalTime ve java.time.LocalDate

LocalTime midnight = LocalTime.MIDNIGHT;
LocalDate today = LocalDate.now(ZoneId.of("Europe/Berlin"));
LocalDateTime todayMidnight = LocalDateTime.of(today, midnight);
LocalDateTime tomorrowMidnight = todayMidnight.plusDays(1);

Joda-Time

JDK <8 kullanıyorsanız , API gerçekten güzel olduğu için Joda Time'ı öneriyorum :

DateTime date = new DateTime().toDateMidnight().toDateTime();
DateTime tomorrow = date.plusDays(1);

Joda Zamanın sürüm 2.3 beri DateMidnightolduğu kullanımdan kaldırıldı , bu yüzden bu kullanın:

DateTime today = new DateTime().withTimeAtStartOfDay();
DateTime tomorrow = today.plusDays(1).withTimeAtStartOfDay();

JVM'nin geçerli varsayılan saat dilimini istemiyorsanız bir saat dilimi iletin.

DateTimeZone timeZone = DateTimeZone.forID("America/Montreal");
DateTime today = new DateTime(timeZone).withTimeAtStartOfDay(); // Pass time zone to constructor.

Yardımınız için teşekkürler, orijinal sorumu şu anda nasıl yaptığımla güncelledim. Önerin için teşekkürler.

3
JodaTime 2.3'ten itibaren toDateMidnightkullanımdan kaldırılmıştır. Ayrıntılar için bu cevaba bakınız: stackoverflow.com/a/19048833/363573
Stephan

JDK 8 için bir çözüm ekledi
timaschew

1
@timaschew Genel olarak doğru olsa ZonedDateTimeda, Joda-Time bölümünde yaptığınız gibi bölgelere ayrılmış bir tarih-saat değeri ( ) kullanarak java.time yapmanızı öneririm . Local…Hiçbir kaybetmek, / görmezden tüm ofset ve saat dilimi bilgilerini onların tüm amacı - tipleri hiçbir zaman dilimi bilgilere sahibiz. Özellikle Soru bu değerlerin karşılaştırma için kullanılmasından bahsederken (belki de veritabanı sorguları?), Bölgelere ayrılmış bir tarih-saat değerinin daha yararlı olması muhtemeldir.
Basil Bourque

1
@Amalgovinus Calendar.HOUR değil, Calendar.HOUR_OF_DAY ayarını yaptığınızdan emin olun.
Oswald

43

Tamlık uğruna, Java 8 kullanıyorsanız, UTC'de gece yarısı almak truncatedToiçin Instantsınıf yöntemini de kullanabilirsiniz .

Instant.now().truncatedTo(ChronoUnit.DAYS);

Javadoc'ta yazıldığı gibi

Örneğin, MINUTES birimiyle kısaltma, en yakın dakikaya yuvarlanarak saniye ve nanosaniyeyi sıfıra ayarlar.

Umarım yardımcı olur.


1
İpucu için teşekkürler. Belirtilen saat diliminde gece Date.from(date.toInstant().atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toInstant())
yarısını almak uzar


33

Bir gece yarısı bulmanın en kolay yolu:

Long time = new Date().getTime();
Date date = new Date(time - time % (24 * 60 * 60 * 1000));

Ertesi gün:

Date date = new Date(date.getTime() + 24 * 60 * 60 * 1000);

Bu kodu çalıştırdım ve aldım: Gece yarısı: Perş 01 19:00:00 CDT 2012
Dave

3
System.out.print (tarih) gibi bir şey yaptıysanız, sistem tarih örneğini sistem saat dilimine (CDT) dönüştürdü. CDT saatiyle 19:00, GMT saatiyle gece yarısıdır. Seçili bir saat diliminde gece yarısına ihtiyacınız varsa, DST'yi dikkate alarak bu saat diliminin uzaklığını eklemeniz gerekir.
Andrei Volgin

@Bouncner Öyle. Hangi yöntemi kullanırsanız kullanın Dünya'da birçok farklı 'gece yarısı' zamanı vardır, ancak yalnızca bir gece yarısı Java vardır.
Andrei Volgin

2
@Andrei Volgin Bir "java gece yarısı" olduğunu bilmiyordum. ;) Bu çözümün konu yaratıcısına gerçekten yardım etmediğini söylemek istediğim şey. Bir takvim çözümü, çirkin ikinci hesaplamaları önler ve düzgün kullanıldığında zaman dilimlerini (ve özellikle gün ışığından yararlanma sürelerini vb.) Korur. Bunu çözümünüzde görmüyorum.
Bouncner

Merhaba @AndreiVolgin, Tarih tarihi ile aldım = yeni Tarih (saat + TimeZone.getDefault (). GetRawOffset () - zaman% (24 * 60 * 60 * 1000));
jrey

28

Unutmayın, tarihleri (!) DateTemsil etmek için kullanılmaz . Tarihi temsil etmek için bir takvime ihtiyacınız vardır. Bu:

Calendar c = new GregorianCalendar();

Calendargeçerli saat diliminizde mevcut tarihi temsil eden bir örnek oluşturur . Şimdi ihtiyacınız olan şey, alanın altındaki her alanı (saat, dakika, saniye ve milisaniye) olarak ayarlayarak kesmektir 0. Bugün bir gece yarısı var.

Şimdi ertesi gün gece yarısı almak için bir gün eklemeniz gerekir:

c.add(Calendar.DAY_OF_MONTH, 1);

86400Bu arada oluşabilecek yaz saati nedeniyle saniye veya 24 saat eklemenin yanlış olduğunu unutmayın.

GÜNCELLEME: Ancak bu sorunla başa çıkmak için benim en sevdiğim yol Commons Lang DateUtils sınıfını kullanmaktır :

Date start = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH))
Date end = DateUtils.addDays(start, 1);

CalendarPerde arkasında kullanır ...


15
Yardım için teşekkürler. "Tarih, tarihleri ​​temsil etmek için kullanılmaz" - bu oldukça acayip parlak olacağız, değil mi? ;)

@RobertHume Adil olmak gerekirse, Java'nın ilk sürümünden bu yana Date piyasada. O döneme ait çoğu şey ... mükemmel düşünülenden daha az. Özellikle Java, denediği şeyleri ilk deneyenlerden biri olduğu ve nasıl yapılacağı konusunda kararlaştırılan bir standarttan çok uzaktı .
Monica'nın Davası

14

bu yöntemler size yardımcı olacaktır.

public static Date getStartOfDay(Date date) {
     Calendar calendar = Calendar.getInstance();
     calendar.setTime(date);
     calendar.set(Calendar.HOUR_OF_DAY, 0);
     calendar.set(Calendar.MINUTE, 0);
     calendar.set(Calendar.SECOND, 0);
     calendar.set(Calendar.MILLISECOND, 0);
     return calendar.getTime();
 }

ve

public static Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    calendar.set(Calendar.MILLISECOND, 999);
    return calendar.getTime();
}

9

JodaTime 2.3'ten itibaren toDateMidnight()kullanımdan kaldırılmıştır.

Dan 2.2 ile 2.3 Yükseltme

    2.2'den bu yana kullanımdan kaldırma
    ----------------------
    - DateMidnight [# 41]
     Bu sınıf kavramda kusurlu
     Bazı saat dilimlerinde gece yarısı zaman zaman meydana gelmez
     Bu, 00:00 ile 01:00 arasında yaz saati uygulamasının bir sonucudur.
     DateMidnight aslında bir gece yarısı kilitli bir DateTime
     Böyle bir kavram, LocalDate göz önüne alındığında, genellikle daha zayıf bir kavramdır
     DateMidnight yerine LocalDate yazın
     Veya DateTime ile değiştirin, belki withTimeAtStartOfDay () yöntemini kullanarak

İşte toDateMidnight()yöntemi olmayan bir örnek kod .

kod

DateTime todayAtMidnight = new DateTime().withTimeAtStartOfDay();
System.out.println(todayAtMidnight.toString("yyyy-MM-dd HH:mm:ss"));

Çıktı ( yerel saat diliminize bağlı olarak farklı olabilir )

2013-09-28 00:00:00

2
Mükemmel cevap. Bir geçme katkı olur DateTimeZonebuna örneği DateTime: Bir saat dilimi belirterek ziyade yanlışlıkla varsayılan bağlı önemini vurgulamak için yapıcıDateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
Basil Bourque

9

Diğer cevaplar doğrudur, özellikle arganzheng'in java.time cevabı . Bazıları belirtildiği gibi, kötü tasarlanmış, kafa karıştırıcı ve zahmetli oldukları için eski java.util.Date/.Calendar sınıflarından kaçınmalısınız. Java.time sınıfları tarafından desteklenmiştir.

Gece yarısını ele alma stratejisi ve zaman dilimleri hakkında notlar ekleyeyim .

Yarı açık

Tarih-saat çalışmasında, zaman dilimleri genellikle “Yarı Açık” yaklaşımı kullanılarak tanımlanır. Bu yaklaşımda başlangıç kapsayıcı biten iken münhasır . Bu, sorunları çözer ve tutarlı bir şekilde kullanılırsa, tarih-zaman işlemenizle ilgili mantığı çok daha kolay hale getirir.

Çözülen bir sorun, günün sonunu tanımlamaktır. Günün son anı mı 23:59:59.999( milisaniye )? Belki de java.util.Date sınıfında (en eski Java'dan; zahmetli - bu sınıftan kaçının!) Ve son derece başarılı Joda-Time kütüphanesinde. Ancak Postgres gibi veritabanı gibi diğer yazılımlarda son an 23:59:59.999999( mikrosaniye ) olacaktır. Ancak java.time çerçevesi (Java 8 ve üstü, Joda-Time'ın halefi) gibi diğer yazılımlarda ve H2 Veritabanı gibi bazı veritabanlarında son an 23:59.59.999999999( nanosaniye ) olabilir . Saçları ayırmak yerine, sadece ilk anı düşünün, son anı düşünmeyin.

Half-Open'da bir gün, bir günün ilk anından başlar ve ertesi günün ilk anına kadar gider, ancak bunu içermez . Öyle düşünmek yerine:

… Bugünden 00:00 (bu sabah erken gece yarısı) ile 12:00 (gece yarısı) arasında.

… Böyle düşün…

bugünün ilk anından yarının ilk anına kadar devam eder, ancak dahil değildir:
(> = 00:00:00.0bugün VE < 00:00:00.0yarın)

Veritabanı çalışmasında, bu yaklaşım anlamına değil kullanarak BETWEENoperatörü SQL.

Günün başlangıcı

Ayrıca, günün ilk anı her zaman günün saati değildir00:00:00.0 . Yaz saati uygulaması (DST) bazı saat dilimlerinde ve muhtemelen diğer anormalliklerde, günün farklı bir saatte başladığı anlamına gelebilir.

Bu nedenle, java.time sınıfları bir çağrıyla günün başlangıcını belirleme işini yapsın LocalDate::atStartOfDay( ZoneId ). Bu yüzden , bu örnek kodda gördüğünüz gibi LocalDatetekrardan sapmalıyız ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );

İsteğe bağlı geçişi not edin ZoneId. Atlanırsa, JVM'nizin geçerli varsayılan saat dilimi örtülü olarak uygulanır. Açık olmak daha iyi.

Saat dilimi, tarih-saat çalışması için çok önemlidir. Soru ve diğer bazı Cevaplar potansiyel olarak kusurludur, çünkü zaman dilimini bilinçli olarak ele almazlar.

Dönüştürmek

Eğer varsa gereken bir java.util.Date veya .Calendar kullanın o eski sınıfların eklenen yeni dönüşüm yöntemlerinin arayın.

java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );

Zaman aralığı

Bu arada, zaman dilimleri ile çok fazla iş yapıyorsanız, şunlara bir göz atın:

  • Duration
  • Period
  • Interval
    IntervalSınıf bulunur ThreeTen-Extra , proje java.time çerçevesine bir uzantı. Bu proje, java.time'a gelecekteki olası eklemeler için kanıt zeminidir.
    Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );

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.

Artık bakım modunda olan Joda-Time projesi java.time sınıflarına geçişi tavsiye ediyor .

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

Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. JDBC 4.2 veya sonraki bir sürümüyle uyumlu bir JDBC sürücüsü kullanın . Dizeye gerek yok, gerek yokjava.sql.* sınıflara .

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

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


6

java.time

Java 8 ve üstünü kullanıyorsanız, java.time paketini deneyebilirsiniz ( Eğitim ):

LocalDate tomorrow = LocalDate.now().plusDays(1);
Date endDate = Date.from(tomorrow.atStartOfDay(ZoneId.systemDefault()).toInstant());

2
İyi cevap. İstenen / beklenen saat dilimini belirtmenizi öneririm. JVM'nin geçerli varsayılan saat dilimi işletim sistemi ayarlarına, bilgisayarları değiştirmeye veya JVM'nin herhangi bir iş parçacığında herhangi bir uygulamada değişiklik gösterebilir.
Basil Bourque

4

Bu bir seçenek gibi görünüyor:

DateFormat justDay = new SimpleDateFormat("yyyyMMdd");
Date thisMorningMidnight = justDay.parse(justDay.format(new Date()));

ona bir gün eklemek için

Date tomorrow = new Date(thisMorningMidnight.getTime() + 24 * 60 * 60 * 1000);

veya

Calendar c = Calendar.getInstance();
c.setTime(thisMorningMidnight);
c.add(Calendar.DATE, 1);
Date tomorrowFromCalendar = c.getTime();

Gün ışığından yararlanma gibi garip bir şey olması durumunda 24 saat eklemenin yeterli olmamasına neden olan bir önsezim tercih edilir (bkz. Https://stackoverflow.com/a/4336131/32453 ve diğer cevaplar).


Benim sqlite veritabanında uzun olarak temsil edilen bir tarih ve saat var. Ertesi günün başlangıcı için uzun bir zamana ihtiyacım var. Bir Date nesnesini yukarıda kullandığınız SimpleDateFormat yönteminden ziyade uzun süremle kullanabilir miyim?
AJW

1
Doğru milisaniye olduğu sürece onu bir kurucu olarak geçirebilirsiniz: docs.oracle.com/javase/7/docs/api/java/util/…
rogerdpack

1

Bunu buradaki diğer herkesten farklı yaptım. Java'da yeniyim, belki de çözümüm zayıf.

Date now = new Date();
Date midnightToday = new Date(now.getYear(), now.getMonth(), now.getDate());

Bunun işe yaradığından emin değilim, ama her iki durumda da, bu çözüm hakkında herhangi bir geri bildirim almaktan memnuniyet duyarım.

Yarın arayarak hesaplayabileceğiniz yukarıdaki ifadeyle kafam karıştı:

c.add(Calendar.DAY_OF_MONTH, 1);

Ayın gününe 1 eklerseniz ve bu gün 31. gün ise, ayın 32. gününü alamaz mısın?

Neden zamanlar / tarihler Java'daki UTC'ye dayanmıyor? Timezones'a yalnızca i / o ile kullanıldığında ihtiyaç duyulacağını, ancak dahili olarak her zaman UTC'de kullanılması gerektiğini düşünüyorum. Ancak, sınıflar sadece israfa değil, aynı zamanda kodlama hatalarına eğilimli gibi görünen Timezone bilgilerini de içeriyor gibi görünüyor.


2
Merhaba Mitch. Çözümünüzün işe yaradığını düşünüyorum, ancak Tarih oluşturucunun kullanımdan kaldırıldığı anlaşılıyor. Java kullanıcıları, orijinal Tarihle ilgili yöntemlerin çoğunu bir süre önce kullanımdan kaldırmış ve bunları Takvim ile ilgili daha yeni yöntemlerle değiştirmiştir. Şahsen bunun nasıl bir gelişme olduğunu görmüyorum, ancak kullanımdan kaldırılmış yöntemleri kullanmaktan hoşnut değil. Teşekkürler!

Yoksunluktan dolayı üzgün. Saati, dakikayı, saniyeyi ve milisaniyeleri temizlemek yerine yılı, ayı ve tarihi belirtmek benim için çok daha temiz görünüyor. Bunları temizlemek, milisaniyelerin Date sınıfının en ince ayrıntısına dayanmasına rağmen, benim çözümüm buna dayanmıyor. Benim çözümüm de daha kısa ve net. Java'da yeni olmak, tarihleri ​​ve saatleri kullanma konusunda C ++ 'ın ne kadar temiz, kolay ve verimli olduğunu gerçekten takdir ediyor.
Mitch

@Mitch Deneyimlerime göre, öğrendiğiniz en yeni dil her zaman en karmaşık olarak algılanıyor.
ArtOfWarfare

FYI: Bu kanlı korkunç eski tarih-saat sınıfları artık modern java.time sınıflarının yerini aldı.
Basil Bourque


0

JodaTime ile en basit yol

DateMidnight date = DateMidnight.now();


2
Hayır. Joda-Time'daki "gece yarısı" ile ilgili sınıflar ve yöntemlerin tümü kullanımdan kaldırılmıştır. Kusurlu bir konsepte dayanıyorlardı. Günün ilk anı her zaman değil 00:00:00.000. Bunun yerine yeni withTimeAtStartOfDayyöntemi kullanın . Joda-Time'ın mevcut 2.4 sürümüne güncelleyin ve sürüm notlarını okuyun. Örnek:DateTime today = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay();
Basil Bourque

0

Bir gün 24 * 60 * 60 * 1000ms olduğu için, bu günün gece yarısı olarak hesaplanabilir ...

long now = System.currentTimeMillis();
long delta = now % 24 * 60 * 60 * 1000;
long midnight = now - delta;
Date midnightDate = new Date(midnight);`

1
Bu kod yalnızca UTC için geçerlidir ve başka bir saat dilimi için geçerli değildir ve Yaz Saati Uygulaması gibi anormallikleri yok sayar. Dahası, şaşırtıcı derecede zor bir konu olduğu için kendi tarih-zaman çözümlerinizi rulo haline getirmeyin. Bunun yerine mükemmel java.time sınıflarını kullanın.
Basil Bourque

0

Daha önce verilen cevaplar kadar, ama kimse AM_PM parametresinden bahsetmedi:

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    cal.set(Calendar.AM_PM, Calendar.AM);

1
Zahmetli Calendarsınıf tarafından yıllar önce supplanted edildi java.time özellikle sınıflar ZonedDateTime.
Basil Bourque

0
Date now= new Date();
// Today midnight
Date todayMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY);

// tomorrow midnight
Date tomorrowMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY + DateUtils.MILLIS_PER_DAY);

Bu yalnızca UTC için çalışır ve saat dilimlerini ele almaz. Ayrıca, korkunç Datesınıf yıllar önce yerini aldı java.time.Instant. DateGünümüzde kullanmaktan kaçının .
Basil Bourque

0

Apache ortaklarını kullanarak ..

//For midnight today 
Date today = new Date(); 
DateUtils.truncate(today, Calendar.DATE);

//For midnight tomorrow   
Date tomorrow = DateUtils.addDays(today, 1); 
DateUtils.truncate(tomorrow, Calendar.DATE);

Bilginize gibi korkunç zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time sonra Java 8 ve yerleşik sınıflara. Oracle'ın Öğreticisine bakın .
Basil Bourque

@BasilBourque Java 8 için kabul etti. Ama OP Java 7 kullanıyorsa, sanırım yine de işe yarayacaktır.
joe4java

JavaT ve Backport projesinde Java 6 ve 7 için neredeyse aynı API ile neredeyse tüm java.time işlevleri kullanılabilir . Ayrıca ThreeTenABP projesinde Android <26 için uyarlanmıştır . Bu yüzden o sefil eski tarih-saat sınıflarını bir daha kullanmaya gerek yok.
Basil Bourque

-1

Bunun çok eski bir yazı olduğunu biliyorum. Bilgimi burada paylaşmayı düşündüm!

Kesin saat dilimi ile bugün gece yarısı tarihi için aşağıdakileri kullanabilirsiniz

public static Date getCurrentDateWithMidnightTS(){

    return new Date(System.currentTimeMillis() - (System.currentTimeMillis()%(1000*60*60*24)) - (1000*60 * 330));
}

Nerede (1000*60 * 330) gerçek gelen 30hrs: yani çıkarılır ediliyor aslında örnek Hint saat diliminde yani kolkata için saat dilimine ilişkin 5 farklıdır. Yani milisaniyeye dönüştürerek bunu çıkarmak.

Yani son çıkarılan sayıyı size göre değiştirin. Ben sadece Hindistan merkezli bir ürün oluşturma m Yani sadece belirli bir zaman damgası kullanılır.


1
Kabul edilen cevap yerine neden bunu öneriyorsunuz? Tarih-saat değerlerinizi yuvarlamak genel olarak risklidir. Özellikle bu kod sonsuza dek tek bir saat diliminin mevcut ofsetine sabit olarak kodlanmıştır. Yaz Saati Uygulaması veya diğer anormallikler için herhangi bir muhasebe yoktur. Ben hiçbir katma değer ile sadece olumsuz görüyorum.
Basil Bourque

@ Tabii cevap kabul ediyorum ve evet ben orada sabit kodlanmış değeri için bahsetti. Bu, yalnızca belirli bir saat dilimi üzerinde çalışmanız durumunda faydalıdır.
Rajeev

-1
Date todayMidnightUTC = java.sql.Date.valueOf(LocalDate.now());
Date tomorrowMidnightUTC = java.sql.Date.valueOf(LocalDate.now().plusDays(1));
Date anyMidnightLocal = java.sql.Date.valueOf(LocalDate.from(dateTime.toInstant().atZone(ZoneId.systemDefault())));

Ama dikkat java.sql.Date.toInstant()her zaman atar UnsupportedOperationException.

Via java.util.Date için LOCALDATE ve vice En basit dönüşüm tam tersi?


İyi bir cevap değil . Modern java.time kullanımını destekledikleri eski miras sınıflarıyla karıştırıyorsunuz. Ve özellikle, yalnızca doğrudan java.time sınıflarıyla ilgilenmek için güncellenmemiş bir veritabanı ile veri alışverişi yapmak için kullanılması gereken, asla iş mantığı için kullanılmayan java.sql tarih-saat sınıflarını kullanırsınız. Yine bir başka sorun, saat dilimi için önemli sorunu görmezden gelmenizdir.
Basil Bourque

@BasilBourque, eleştiri için teşekkürler. Başka bir eski sınıf örneği elde etmek için kullanımdan kaldırılmış olarak işaretlenmemiş bir eski sınıfı kullanmak oldukça güvenlidir. Saat dilimi sorunu daha önemlidir. Sonuçta riccardo'nun cevabına sadık kalmaya karar verdim .
Vadzim

-1

Eski moda yol..

private static Date getDateWithMidnight(){
    long dateInMillis = new Date().getTime();
    return new Date(dateInMillis - dateInMillis%(1000*60*60*24) - TimeZone.getDefault().getOffset(dateInMillis));
}

Bu zahmetli sınıf yıllar önce java.time.Instant sınıfı tarafından desteklendi . Hiç kullanmaya gerek yok Date.
Basil Bourque

Bu Datesınıf her zaman UTC'dir. Böylece istenen / beklenen saat dilimi konusunu görmezden geliyorsunuz. Örneğin, Kolkata Hindistan'da UTC'den çok saat önce ve Montréal Québec'te UTC'den saatler sonra yeni bir gün geçiyor.
Basil Bourque
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.