Yıl, ay, günden java tarih nesnesi oluşturma


102
int day = Integer.parseInt(request.getParameter("day"));  // 25
int month = Integer.parseInt(request.getParameter("month")); // 12
int year = Integer.parseInt(request.getParameter("year")); // 1988

System.out.println(year);

Calendar c = Calendar.getInstance();
c.set(year, month, day, 0, 0);  

b.setDob(c.getTime());

System.out.println(b.getDob());  

Çıktı:

1988
25 Ocak Çar 00:00:08 IST 1989

Geçiyorum 25 12 1988ama anlıyorum 25 Jan 1989. Neden?


1
Kodda b nedir?
MysteryGuy

Yanıtlar:


117

Aylar, Takvim'de sıfır tabanlıdır. Yani 12, aralık + 1 ay olarak yorumlanır. Kullanım

c.set(year, month - 1, day, 0, 0);  

5
IBM API tasarımcıları, JavaScript API tasarımcıları. Bunun dışında muhtemelen hiç kimse. Takvim'in artık doğru olanı yapan Java 8 java.time API'si tarafından kullanımdan kaldırıldığını unutmayın.
JB Nizet

67

Java 8'den önceki en sevdiğim yol:

Date date = new GregorianCalendar(year, month - 1, day).getTime();

Bunun şunlardan daha temiz bir yaklaşım olduğunu söyleyebilirim:

calendar.set(year, month - 1, day, 0, 0);

5
Ay Calendarsabitler kullanılarak belirtilebilir, örn. Calendar.FEBRUARY.
Geekarist

1
Dikkat edin, Java 7'de aylar sıfırdan numaralandırılırdı. Sorunları önlemek için sabitleri kullanın.
jediz

Yapılması gereken bir nokta - iki arama sırasında farklı sonuçlar verir getTime(). Yapıcıda bilgi ayarlamak, ikinci yaklaşım geçerli saati kullandığından günün başlangıcında zamanı verir. Dokümanlara bakın . Dolayısıyla ilki, insanların gerçekte ne yapmaya çalıştığını varsayarak muhtemelen daha iyi bir yaklaşımdır.
funct7

28

java.time

java.timeJava 8'de yerleşik çerçeveyi kullanma

int year = 2015;
int month = 12;
int day = 22;
LocalDate.of(year, month, day); //2015-12-22
LocalDate.parse("2015-12-22"); //2015-12-22
//with custom formatter 
DateTimeFormatter.ofPattern formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate.parse("22-12-2015", formatter); //2015-12-22

Ayrıca zaman hakkında bilgiye ihtiyaç duyarsanız (saat, dakika, saniye) bazı dönüşümü kullanan LocalDateiçinLocalDateTime

LocalDate.parse("2015-12-22").atStartOfDay() //2015-12-22T00:00

İyi Cevap, ancak biliniyorsa bir saat dilimi belirtin. A'nın LocalDatesaat dilimi yoktur ve bu nedenle zaman çizelgesinde kesin bir anı temsil etmez. Bağlamınız bir saat dilimini gösteriyorsa, bir ZonedDateTimenesne almak için uygulayın : LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
Basil Bourque

9

Java'nın Takvim temsili en iyisi değil, Java 8 için üzerinde çalışıyorlar. Joda Time veya benzeri bir kitaplığı kullanmanızı tavsiye ederim .

Joda Time kitaplığından LocalDate'in kullanıldığı hızlı bir örnek:

LocalDate localDate = new LocalDate(year, month, day);
Date date = localDate.toDate();

Burada hızlı bir başlangıç ​​eğitimini takip edebilirsiniz.


6

JavaDoc'a bakın :

ay - AY takvim alanını ayarlamak için kullanılan değer. Ay değeri 0 tabanlıdır. ör. Ocak için 0.

Yani belirlediğiniz ay, gelecek yılın ilk ayıdır.


0

Tarihler, zaman damgaları ve sürelerle çalışırken hayatınızı kolaylaştırın. HalDateTime'ı şuradan kullanın:

http://sourceforge.net/projects/haldatetime/?source=directory

Örneğin, girişinizi şu şekilde ayrıştırmak için kullanabilirsiniz:

HalDateTime mydate = HalDateTime.valueOf( "25.12.1988" );
System.out.println( mydate );   // will print in ISO format: 1988-12-25

Ayrıştırma ve yazdırma için desenler de belirtebilirsiniz.


3
Görünüşe göre kendi kütüphane sınıfınızı tanıtıyorsunuz? Muhtemelen buna izin verilir, ancak ana geliştirici olup olmadığınızı söylerseniz daha iyi görünür HalDateTime.
Ole VV

Olumsuz oy vermedim. Ancak tarihlerle hayat asla kolay değildir. Kütüphaneniz bu gerçeği değiştirmeyecek.
kiltek

Neden olumsuz oy vermelisiniz? Kitaplığımın tarihi 2013 yılına aittir. Tüm işlevler, JSR 310'da belirtildiği gibi java.time olarak mevcuttur ve şahsen bulduğum en iyi tasarlanmış API'lerden biridir. Bunu kullanmanızı tamamen tavsiye ederim.
Hajo Lemcke
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.