Java 截至DB日期的天数总和

Java 截至DB日期的天数总和,java,Java,当我试图用数据库中获得的日期添加30天时,给出了这个错误 DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Date today = Calendar.getInstance().getTime(); String reportDate = df.format(today); String endDay = rset.getString("vip_end"); endDay.add(Calendar.DAY_OF_MONTH, 30)

当我试图用数据库中获得的日期添加30天时,给出了这个错误

DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date today = Calendar.getInstance().getTime();

String reportDate = df.format(today);


String endDay = rset.getString("vip_end");

endDay.add(Calendar.DAY_OF_MONTH, 30)
错误

tl;博士 2019-06-30

String
您将
endDay
声明为
String
。然后调用方法
add
。但是在
String
类上没有方法
add
。因此,您的错误,如错误消息中所述

java.time 您正在使用可怕的日期时间类,这些类在几年前被采用JSR310的现代java.time类所取代。别这样

该类表示一个只包含日期的值,不包含一天中的时间,也不包含或

时区 时区对于确定日期至关重要在任何给定的时刻,全球各地的日期都会因区域而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能在运行时(!)期间出现,因此您的结果可能会有所不同。最好将所需/预期时区明确指定为参数。如果关键,请与用户确认区域

大陆/地区
的格式指定,例如
美国/蒙特利尔
非洲/卡萨布兰卡
,或
太平洋/奥克兰
。切勿使用2-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

如果要使用JVM的当前默认时区,请请求它并将其作为参数传递。如果省略,代码将变得模棱两可,我们无法确定您是否打算使用默认值,或者您是否像许多程序员一样不知道这个问题

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
或者指定一个日期。你可以用一个数字来设置月份,1-12月的数字为1-12

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
或者,最好使用预定义的枚举对象,一年中每个月一个。提示:在整个代码库中使用这些
Month
对象,而不仅仅是一个整数,这样可以使代码更加自我记录,确保有效值,并提供更高的可用性。同上

生成文本 您的输出格式为标准ISO 8601格式。默认情况下,
LocalDate
类使用此格式来解析/生成字符串。因此,无需指定格式化模式

String output = LocalDate.of( 2019 , Month.JANUARY , 23 ).toString() ;
2019-01-23

日期数学 再加30天

LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
LocalDate later = today.plusDays( 30 ) ;

time类遵循这种模式。因此,它们基于原始对象的值返回一个新的新对象。

为什么使用JavaScript标记?前3行代码与后2行代码无关。在撰写文章时请多加小心。我建议您不要使用
SimpleDateFormat
Date
日历
。这些类设计得很糟糕,而且早已过时,第一个类尤其令人讨厌。相反,只需使用
LocalDate
from。
LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
String output = LocalDate.of( 2019 , Month.JANUARY , 23 ).toString() ;
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
LocalDate later = today.plusDays( 30 ) ;