我使用rp.getStart_date()和hibernate从Oracle数据库中获取日期 现在我想添加15天并显示它。但是因为cal.add()需要第一个参数作为int,它在第二行显示我numberFormatException。我这样做吗?
Date dt=rp.getStart_date();
int s1=Integer.parseInt((dt.toString()));
System.out.println(s1);
SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy");
Calendar cal=Calendar.getInstance();
cal.add(s1, 15);
System.out.println(sdf.format(cal.getTime()));
请帮帮我..
提前致谢..
答案 0 :(得分:2)
尝试,
Date dt = rp.getStart_date();
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
Calendar cal = Calendar.getInstance();
cal.setTime(dt);
cal.add(Calendar.DATE, 15); // Add 15 days
String output = sdf.format(cal.getTime());
System.out.println("Output :: "+output);
答案 1 :(得分:0)
answer by Rakesh KR已接近但不太正确。问题和答案都没有考虑时区。如果忽略指定时区,则会获得JVM的默认时区。依靠默认时区,您可能会有意想不到的结果。
java.util.Calendar的add
方法保留了一天中的小时,调整了夏令时(DST)以及可能的其他异常。因此,如果您使用时区(如美国西海岸)在您的时间跨度内将夏令时改变一小时,那么实际上您将有一个额外/更少的小时。也就是说,您在15天内添加的结果为( ( 15 * 24 ) ± 1 )
。
如果您一直期望( 15 * 24 )
,您会感到惊讶(取决于JVM的默认时区)。
由于Joda-Time中DateTime类的plusDays
方法具有相同的行为,因此我将演示使用Joda-Time。你应该避免使用java.util.Date&无论如何,java.util.Calendar,但在这种情况下,行为与Joda-Time相同。
首先,为了您的信息,来自其他答案的代码可以像这样完成Joda-Time,在java.util.Date世界和Joda-Time世界之间进行转换。但是此代码具有相同的时区问题(受DST影响)。
java.util.Date juDate = new java.util.Date();
java.util.Date juDateLater = new DateTime( juDate ).plusDays( 15 ).toDate() ;
现在使用纯Joda-Time让我们来看看时区如何影响天数的增加。我们将按原样运行此示例代码两次,然后通过注释掉第一个timeZone
行并在此之后启用该行来交换时区。
// Time zone "America/Los_Angeles" begins DST on 2014-03-09 02:00, springing ahead to 03:00.
DateTimeZone timeZone = DateTimeZone.forID( "America/Los_Angeles" );
//DateTimeZone timeZone = DateTimeZone.UTC;
DateTime dateTime_OneAM = new DateTime( 2014, 3, 9, 1, 0, 0, timeZone );
DateTime dateTime_OneAM_Plus15 = dateTime_OneAM.plusDays( 15 );
DateTime dateTime_ThreeAM = new DateTime( 2014, 3, 9, 3, 0, 0, timeZone );
DateTime dateTime_ThreeAM_Plus15 = dateTime_ThreeAM.plusDays( 15 );
long millisElapsedOneAM = ( dateTime_OneAM_Plus15.getMillis() - dateTime_OneAM.getMillis() );
long millisElapsedThreeAM = ( dateTime_ThreeAM_Plus15.getMillis() - dateTime_ThreeAM.getMillis() );
long minutes = ( ( millisElapsedThreeAM - millisElapsedOneAM ) / 1000L / 60L );
转储到控制台...
System.out.println( "timeZone " + timeZone );
System.out.println( "dateTime_OneAM " + dateTime_OneAM + " ( UTC/GMT: " + dateTime_OneAM.toDateTime( DateTimeZone.UTC ) + " )" );
System.out.println( "dateTime_OneAM_Plus15 " + dateTime_OneAM_Plus15 + " ( UTC/GMT: " + dateTime_OneAM_Plus15.toDateTime( DateTimeZone.UTC ) + " )" );
System.out.println( " " ); // Blank line.
System.out.println( "dateTime_ThreeAM " + dateTime_ThreeAM + " ( UTC/GMT: " + dateTime_ThreeAM.toDateTime( DateTimeZone.UTC ) + " )" );
System.out.println( "dateTime_ThreeAM_Plus15 " + dateTime_ThreeAM_Plus15 + " ( UTC/GMT: " + dateTime_ThreeAM_Plus15.toDateTime( DateTimeZone.UTC ) + " )" );
System.out.println( " " ); // Blank line.
System.out.println( "millisElapsedOneAM " + millisElapsedOneAM );
System.out.println( "millisElapsedThreeAM " + millisElapsedThreeAM );
System.out.println( "minutes " + minutes );
使用第一时区运行时,对于美国西海岸...
(请注意UTC中的每小时如何变化或不变化)
timeZone America/Los_Angeles
dateTime_OneAM 2014-03-09T01:00:00.000-08:00 ( UTC/GMT: 2014-03-09T09:00:00.000Z )
dateTime_OneAM_Plus15 2014-03-24T01:00:00.000-07:00 ( UTC/GMT: 2014-03-24T08:00:00.000Z )
dateTime_ThreeAM 2014-03-09T03:00:00.000-07:00 ( UTC/GMT: 2014-03-09T10:00:00.000Z )
dateTime_ThreeAM_Plus15 2014-03-24T03:00:00.000-07:00 ( UTC/GMT: 2014-03-24T10:00:00.000Z )
millisElapsedOneAM 1292400000
millisElapsedThreeAM 1296000000
minutes 60
使用第二时区运行时,表示UTC / GMT ...
timeZone UTC
dateTime_OneAM 2014-03-09T01:00:00.000Z ( UTC/GMT: 2014-03-09T01:00:00.000Z )
dateTime_OneAM_Plus15 2014-03-24T01:00:00.000Z ( UTC/GMT: 2014-03-24T01:00:00.000Z )
dateTime_ThreeAM 2014-03-09T03:00:00.000Z ( UTC/GMT: 2014-03-09T03:00:00.000Z )
dateTime_ThreeAM_Plus15 2014-03-24T03:00:00.000Z ( UTC/GMT: 2014-03-24T03:00:00.000Z )
millisElapsedOneAM 1296000000
millisElapsedThreeAM 1296000000
minutes 0