tl;博士
LocalDate.now().minusDays( 10 )
最好指定时区。
LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )
详情
与早期版本的 Java 捆绑在一起的旧日期时间类,例如 java.util.Date/.Calendar,已被证明是麻烦的、令人困惑的和有缺陷的。避开他们。
java.time
Java 8 及更高版本用新的 java.time 框架取代了那些旧类。见Tutorial。由JSR 310 定义,受Joda-Time 启发,并由ThreeTen-Extra 项目扩展。 ThreeTen-Backport 项目将这些类反向移植到 Java 6 和 7;将 ThreeTenABP 项目迁移到 Android。
这个问题很模糊,不清楚它要求的是仅日期还是日期时间。
LocalDate
对于仅日期,没有时间,使用LocalDate 类。请注意,时区对于确定诸如“今天”之类的日期至关重要。
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );
ZonedDateTime
如果您的意思是日期时间,则使用Instant 类在UTC 的时间线上获取片刻。从那里调整到时区以获取 ZonedDateTime 对象。
Instant now = Instant.now(); // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。