从年,月,日创建Java日期对象


94
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());  

输出为:

1988年
1月25 日星期三00:00:08 IST 1989

我过去了,25 12 1988但我得到了25 Jan 1989。为什么?


1
代码中的b是什么?
MysteryGuy

Answers:


109

日历中的月份从零开始。因此12被解释为12月+ 1个月。用

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

5
IBM API设计器,JavaScript API设计器。除此之外,可能没有人。请注意,Java 8 java.time API现在已经淘汰了Calendar,它做对了。
JB Nizet

63

在Java 8之前,这是我最喜欢的方式:

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

我说这是比以下方法更干净的方法:

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

4
可以使用Calendar常量指定月份,例如。Calendar.FEBRUARY
Geekarist

1
注意,在Java 7中,月份通常从零开始编号。请使用常量来避免麻烦。
jediz

25

java.time

使用java.timeJava 8中内置的框架

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

如果您还需要有关时间(小时,分钟,秒)的信息,请使用从转换LocalDateLocalDateTime

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

很好的答案,但是请指定一个时区(如果知道)。A LocalDate没有时区,因此不代表时间线上的确切时刻。如果您的上下文指示时区,则将其应用于一个ZonedDateTime对象: LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
Basil Bourque

8

Java的Calendar表示不是最好的,他们正在Java 8上使用它。我建议您使用Joda Time或其他类似的库。

这是一个使用Joda Time库中的LocalDate的简单示例:

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

在这里,您可以按照快速入门教程进行操作。


6

参见JavaDoc

month-用于设置MONTH日历字段的值。月值从0开始。例如,一月为0。

因此,您设置的月份是明年的第一个月。


0

使用日期,时间戳和持续时间可以使您的生活变得轻松。从使用HalDateTime

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

例如,您可以使用它来解析您的输入,如下所示:

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

您还可以指定用于解析和打印的模式。


3
看来您要推广自己的图书馆课?这可能是允许的,但是如果您提到自己是的主要开发人员,那看起来会更好HalDateTime
Ole VV

我没有投票。然而,约会绝非易事。您的图书馆不会改变这一事实。
kiltek

为什么要投票?我的图书馆建于2013年。所有功能都可以在JSR 310中指定的java.time中获得,我个人认为这是设计最好的API之一。我完全建议使用那个。
哈霍·莱姆克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.