从年,月,日创建java日期对象
Posted
技术标签:
【中文标题】从年,月,日创建java日期对象【英文标题】:Creating java date object from year,month,day 【发布时间】:2013-05-06 03:21:11 【问题描述】: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 1989 年 1 月 25 日星期三 00:00:08 IST
我通过25 12 1988
,但我得到25 Jan 1989
。为什么?
【问题讨论】:
代码中的b是什么? 对于该问题的新读者,我建议您不要使用Calendar
。该课程设计不良且早已过时。而是使用来自java.time, the modern Java date and time API 的LocalDate
。见the answer by Przemek。
【参考方案1】:
这是我在 Java 8 之前最喜欢的方式:
Date date = new GregorianCalendar(year, month - 1, day).getTime();
我会说这是一种比以下更清洁的方法:
calendar.set(year, month - 1, day, 0, 0);
【讨论】:
可以使用Calendar
常量来指定月份,例如。 Calendar.FEBRUARY
.
注意,Java 7 中的月份过去是从零开始编号的。使用常量来避免麻烦。
需要说明的一点 - 两者在调用 getTime()
时呈现不同的结果。在构造函数中设置信息会在一天的开始提供时间,因为后一种方法使用当前时间。请参阅docs。所以第一个可能是一个更好的方法,假设人们实际上想要做什么。
这将返回一个日期,根据定义,它是 UTC。但是,如果您的 JVM not 也设置为 UTC,您将不会得到您期望的结果。返回的 Date 将具有您输入的日期开始时的 UTC 时间(假设构造函数形式)。我输入了我的生日并得到了之前的日期,b/c 我的电脑的 TZ 距离 UTC 小时 + 小时。【参考方案2】:
见JavaDoc:
month - 用于设置 MONTH 日历字段的值。月份值为 基于 0。例如,0 表示一月。
所以,你设置的月份是明年的第一个月。
【讨论】:
【参考方案3】:java.time
使用 Java 8 内置的java.time
框架
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
如果您还需要有关时间(小时、分钟、秒)的信息,请使用从 LocalDate
到 LocalDateTime
的一些转换
LocalDate.parse("2015-12-22").atStartOfDay() //2015-12-22T00:00
【讨论】:
好答案,但如果知道,请指定时区。LocalDate
没有时区,因此不代表时间线上的确切时刻。如果您的上下文指示时区,则应用它来获取ZonedDateTime
对象:LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
【参考方案4】:
Java 的日历表示不是最好的,他们正在为 Java 8 开发它。我建议您使用 Joda Time 或其他类似的库。
这是一个使用 Joda Time 库中的 LocalDate 的快速示例:
LocalDate localDate = new LocalDate(year, month, day);
Date date = localDate.toDate();
Here您可以按照快速入门教程进行操作。
【讨论】:
【参考方案5】:使用日期、时间戳和持续时间让您的生活更轻松。使用来自
的 HalDateTimehttp://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
您还可以指定用于解析和打印的模式。
【讨论】:
您好像在宣传自己的图书馆课程?这可能是允许的,但如果您提及您是否是HalDateTime
的主要开发人员,那会更好看。
我没有投反对票。然而,约会从来都不是一件容易的事。你的图书馆不会改变这个事实。
为什么要投反对票?我的库可以追溯到 2013 年。所有功能都在 java.time 中可用,如 JSR 310 中指定的那样,我个人认为这是设计最好的 API 之一。我完全推荐使用那个。【参考方案6】:
日历中的月份从零开始。所以 12 被解释为 12 月 + 1 个月。使用
c.set(year, month - 1, day, 0, 0);
【讨论】:
IBM API 设计师,javascript API 设计师。除此之外,可能没有人。请注意,Calendar 现在被 Java 8 java.time API 淘汰了,它做正确的事情。以上是关于从年,月,日创建java日期对象的主要内容,如果未能解决你的问题,请参考以下文章