从年,月,日创建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

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

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】:

使用日期、时间戳和持续时间让您的生活更轻松。使用来自

的 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

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

【讨论】:

您好像在宣传自己的图书馆课程?这可能是允许的,但如果您提及您是否是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日期对象的主要内容,如果未能解决你的问题,请参考以下文章

javascript中创建日期对象

如何从数组更改日期格式

Paypal 订阅在特定日期自动付款?

如何在java中将时间设置为日期对象

libcareplus多补丁管理

CoreOS coreos-assembler文档