28

我可以用什么来代替这个,new Date(2009, 12, 9)

谢谢你的帮助。

4

8 回答 8

26

注意:这个答案是在 2009 年编写的。从那时起,java.time它已成为 Java 中首选的日期/时间 API。


理想情况下,请改用Joda Time。它是一种比内置 API 优越得多的 API。然后,您需要根据您的确切要求进行选择LocalDateTimeDateTime这是一个复杂的领域 - 我不会尝试用一两句话来总结,但文档做得很好)。

如果绝对必要,请使用java.util.CalendarDate在需要时将其转换为 a。

于 2009-12-09T14:35:12.890 回答
25

日历 !

Calendar cal = Calendar.getInstance();
cal.set(2009, Calendar.DECEMBER, 12);

请注意,我没有把 12 放在 12 月,因为它实际上是 11(一月是 0)。

然后,您可以使用以下命令轻松添加或删除秒、分钟、小时、天、月或年:

cal.add(Calendar.HOUR, 2);
cal.add(Calendar.MONTH, -5);

最后,如果你想要一个 Date :

cal.getTime();
于 2009-12-09T14:55:33.710 回答
17

如果您查看Javadoc,它会指出您使用Calendar

从 JDK 版本 1.1 开始,替换为 Calendar.set(year + 1900, month, date, hrs, min) 或 GregorianCalendar(year + 1900, month, date, hrs, min)。

如果您查看Date构造函数参数,您会看到它被弃用的原因:

参数:

year - the year minus 1900.
month - the month between 0-11.
date - the day of the month between 1-31.
hrs - the hours between 0-23.
min - the minutes between 0-59.

year不是你所期望的,也不是month

要表示您提到的日期,您需要Date像这样调用(不推荐)

new Date(2009-1900, 12-1, 9)

替代使用Calendar

Calendar cal = Calendar.getInstance();
cal.set(2009, 11, 9); //year is as expected, month is zero based, date is as expected
Date dt = cal.getTime();
于 2009-12-09T14:35:23.443 回答
8

您还可以使用SimpleDateFormat对象:

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;


public class DateTest {
    public static void main( String [] args ) throws ParseException {
        SimpleDateFormat sdf =  new SimpleDateFormat("yyyy, MM, dd");
        Date date = sdf.parse("2009, 12, 9");
        System.out.println( date );
    }
}
于 2009-12-09T14:43:36.410 回答
4

蒂姆,在您的评论中,您提到您在 GXT 上下文中执行此操作 - 即在 GWT 客户端代码中。GWT 不支持 GregorianCalendar,您很可能无法通过 GWTCompiler 放置 JodaTime(您可能可以,但您真的想要)。

如果您想在 GWT 中执行日历操作,我认为您确实可以选择使用 JNSI。请参阅 JavaScript 中的 Date 类。

于 2009-12-09T17:13:55.597 回答
3

java.time

java.util日期时间 API 及其格式化 API已SimpleDateFormat过时且容易出错。建议完全停止使用它们并切换到现代 Date-Time API *

此外,下面引用的是Joda-Time 主页上的通知:

请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

使用java.time现代 API 的解决方案:

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        ZonedDateTime zdt = LocalDate.of(2009, 12, 9).atStartOfDay(ZoneId.of("Etc/GMT"));
        System.out.println(zdt);
    }
}

输出:

2009-12-09T00:00Z[Etc/GMT]

Z输出中的 是零时区偏移的时区指示符。它代表 Zulu 并指定Etc/UTC时区(时区偏移量为+00:00小时)。

出于任何原因,如果您需要将此对象转换ZonedDateTime为 的对象java.util.Date,您可以执行以下操作:

Instant instant = zdt.toInstant();
Date date = Date.from(instant);

ONLINE DEMO

与 一样java.util.Date,an表示UTCInstant时间线上的一个瞬时点,但与 不同,它不表示真正的 Date-Time 对象(对象仅表示自称为“纪元”的标准基准时间以来的毫秒数,即),它代表一个真实的日期时间对象。java.util.Datejava.util.DateJanuary 1, 1970, 00:00:00 GMT

Trail: Date Time了解更多关于java.time现代日期时间 API *的信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-06-04T18:58:55.920 回答
2
GregorianCalendar(year + 1900, month, date)

https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Date.html

于 2009-12-09T14:35:57.547 回答
2

不幸的是,Java 中的日期支持非常糟糕。正式地,您可能必须使用日历来执行此操作,但我认为这不是必需的。就像其他人提到的那样,Joda 时间要好得多,但仍然不如 Ruby on Rails 中的日期那么容易使用。

我不知道有任何 Java 包可以为您提供相当多的日期支持(Joda 有点不足,但很接近),但在 Groovy 中,使用 TimeCategory 可以为您提供非常类似于 Ruby on Rails 的日期支持。

于 2009-12-09T14:51:18.350 回答