我怎样才能在java日期对象中更改月份?

Ela*_*da2 3 java time calendar date

我有java日期对象.

如何在不改变年份的情况下更改月份.

例如

14年12月1日

我想把它改成

12/3/14和12/10/14

我基本上想要在不改变年份的情况下将月份改变+/- x月.

可以吗?

TJ-*_*TJ- 7

Calendar cal = Calendar.getInstance();
cal.setTime(date); // your date (java.util.Date)
cal.add(Calendar.MONTH, x); // You can -/+ x months here to go back in history or move forward.
return cal.getTime(); // New date
Run Code Online (Sandbox Code Playgroud)

ref:Java日历

  • 不,add方法可以溢出到明年或上一年.但OP希望保留这一年.另一种方法可能是roll() - 方法,但set() - 方法可能是最好的方法. (2认同)

Bas*_*que 5

太长了;博士

\n
myJavaSqlDate      // Object of terrible legacy class `java.sql.Date` that *pretends* to represent a date-only value.\n.toLocalDate()     // Convert to modern replacement, `java.time.LocalDate`. \n.withMonth( 3 )    // Swap out month for March while keeping the year and day-of-month.\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 或:

\n
myJavaUtilDate                      // Object of terrible legacy class `java.util.Date` representing a moment as seen in UTC.\n.toInstant()                        // Convert to modern replacement, `java.time.Instant`. \n.withZone(                          // Adjust from UTC (offset of zero) to a specific time zone.\n    ZoneId.of( "Africa/Tunis" )     // Real time zone names have format of `Continent/Region`. \n)                                   // Returns a `ZonedDateTime` object.\n.toLocalDate()                      // Returns a `LocalDate` object.\n.plusMonths( 2 )                    // Add two months while trying to keep same day-of-month. Returns another `LocalDate` object rather than altering the first, per immutable objects pattern.\n
Run Code Online (Sandbox Code Playgroud)\n

java.time

\n
LocalDate localDate = LocalDate.of ( 2017, Month.JANUARY, 23 );\nLocalDate localDateFeb = localDate.withMonth ( 2 );\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 或 \xe2\x80\xa6

\n
LocalDate localDateFeb = localDate.withMonth ( Month.FEBRUARY.getValue ( ) );\n
Run Code Online (Sandbox Code Playgroud)\n
\n

localDate.toString(): 2017-01-23

\n
\n
\n

localDateFeb.toString(): 2017-02-23

\n
\n

其他答案使用麻烦的旧日期时间类,现在已被 java.time 类取代。

\n

适应java.sql.Date课堂

\n

如果您java.sql.Date手头有一个类,请从那个可怕的遗留类转换为它的现代替代品,java.time.LocalDate. 调用添加到旧类的新to\xe2\x80\xa6/转换方法。from\xe2\x80\xa6

\n
LocalDate localDate = myJavaSqlDate.toLocalDate() ;\nLocalDate later = localDate.plusMonths( 2 ) ;  // or `withMonth( 3 )`.\n
Run Code Online (Sandbox Code Playgroud)\n

适应java.util.Date课堂

\n

如果您java.util.Date手头有一个类,请从那个可怕的遗留类转换为它的现代替代品,java.time.LocalDate. 为了到达那里,我们必须跨越几个障碍。

\n

java.util.Date不管类名如何,对象代表一个时刻,而不是一个日期。我所说的“时刻”是指与 UTC 的偏移量为零时-分-秒的日期。因此,我们需要从这个遗留类转换为它的现代替代品,java.time.Instant. 调用添加到旧类的新to\xe2\x80\xa6/转换方法。from\xe2\x80\xa6

\n
myJavaSqlDate      // Object of terrible legacy class `java.sql.Date` that *pretends* to represent a date-only value.\n.toLocalDate()     // Convert to modern replacement, `java.time.LocalDate`. \n.withMonth( 3 )    // Swap out month for March while keeping the year and day-of-month.\n
Run Code Online (Sandbox Code Playgroud)\n

区域决定日期

\n

你想要约会。但这里有一个减速带。请注意,对于任何特定时刻,全球各地的日期都会因时区而异。在某个特定时刻,日本东京可能是“明天”,而美国俄亥俄州托莱多仍然是“昨天”。因此,感知特定时刻的日期需要时区。

\n

对于时区,请使用 class ZoneId。以、、 或 等格式指定正确的时区名称。切勿使用 2-4 个字母的缩写,例如或,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。Continent/RegionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST

\n
myJavaUtilDate                      // Object of terrible legacy class `java.util.Date` representing a moment as seen in UTC.\n.toInstant()                        // Convert to modern replacement, `java.time.Instant`. \n.withZone(                          // Adjust from UTC (offset of zero) to a specific time zone.\n    ZoneId.of( "Africa/Tunis" )     // Real time zone names have format of `Continent/Region`. \n)                                   // Returns a `ZonedDateTime` object.\n.toLocalDate()                      // Returns a `LocalDate` object.\n.plusMonths( 2 )                    // Add two months while trying to keep same day-of-month. Returns another `LocalDate` object rather than altering the first, per immutable objects pattern.\n
Run Code Online (Sandbox Code Playgroud)\n

应用该时区以根据 的 UTC 进行调整Instant。调整结果为ZonedDateTime. 原版Instant和原版ZonedDateTime都代表了同一时刻,时间轴上的同一点,只是它们的挂钟时间不同。

\n
LocalDate localDate = LocalDate.of ( 2017, Month.JANUARY, 23 );\nLocalDate localDateFeb = localDate.withMonth ( 2 );\n
Run Code Online (Sandbox Code Playgroud)\n

从该特定时区的那一刻(日期和时间)开始,我们只需要您的工作日期。所以提取一个LocalDate对象。并添加或交换您想要的月份。

\n
LocalDate localDateFeb = localDate.withMonth ( Month.FEBRUARY.getValue ( ) );\n
Run Code Online (Sandbox Code Playgroud)\n
\n

关于java.time

\n

java.time框架内置于 Java 8 及更高版本中这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

\n

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

\n

Joda -Time项目现在处于维护模式,建议迁移到java.time类。

\n

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 和 JPA 2.2 支持java.timejava.sql.*

\n

从哪里获取 java.time 类?

\n\n
\n

乔达时间

\n

更新:Joda-Time项目现在处于维护模式,团队建议迁移到java.time类。

\n

Joda -Time库有一个LocalDate类来表示仅日期,没有时间或时区。

\n

您可以任意设置月份值。但请注意,并非所有月份都有相同的天数,因此当月的日期值为 29、30 和 31 时会出现问题。

\n
LocalDate localDate = new LocalDate( 2014 , 12 , 31 ); // December.\nLocalDate localDate_Feb = localDate.withMonthOfYear( 2 ); // February.\n
Run Code Online (Sandbox Code Playgroud)\n

转储到控制台。

\n
System.out.println( "localDate: " + localDate );\nSystem.out.println( "localDate_Feb: " + localDate_Feb ); \n
Run Code Online (Sandbox Code Playgroud)\n

运行时。

\n
LocalDate localDate = myJavaSqlDate.toLocalDate() ;\nLocalDate later = localDate.plusMonths( 2 ) ;  // or `withMonth( 3 )`.\n
Run Code Online (Sandbox Code Playgroud)\n