我可以用什么来代替这个,new Date(2009, 12, 9)
?
谢谢你的帮助。
注意:这个答案是在 2009 年编写的。从那时起,java.time
它已成为 Java 中首选的日期/时间 API。
理想情况下,请改用Joda Time。它是一种比内置 API 优越得多的 API。然后,您需要根据您的确切要求进行选择LocalDateTime
(DateTime
这是一个复杂的领域 - 我不会尝试用一两句话来总结,但文档做得很好)。
如果绝对必要,请使用java.util.Calendar并Date
在需要时将其转换为 a。
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();
从 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();
您还可以使用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 );
}
}
蒂姆,在您的评论中,您提到您在 GXT 上下文中执行此操作 - 即在 GWT 客户端代码中。GWT 不支持 GregorianCalendar,您很可能无法通过 GWTCompiler 放置 JodaTime(您可能可以,但您真的想要)。
如果您想在 GWT 中执行日历操作,我认为您确实可以选择使用 JNSI。请参阅 JavaScript 中的 Date 类。
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);
与 一样java.util.Date
,an表示UTCInstant
时间线上的一个瞬时点,但与 不同,它不表示真正的 Date-Time 对象(对象仅表示自称为“纪元”的标准基准时间以来的毫秒数,即),它代表一个真实的日期时间对象。java.util.Date
java.util.Date
January 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 desugaring和How to use ThreeTenABP in Android Project。
GregorianCalendar(year + 1900, month, date)
https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Date.html
不幸的是,Java 中的日期支持非常糟糕。正式地,您可能必须使用日历来执行此操作,但我认为这不是必需的。就像其他人提到的那样,Joda 时间要好得多,但仍然不如 Ruby on Rails 中的日期那么容易使用。
我不知道有任何 Java 包可以为您提供相当多的日期支持(Joda 有点不足,但很接近),但在 Groovy 中,使用 TimeCategory 可以为您提供非常类似于 Ruby on Rails 的日期支持。