我希望从当前日期开始的小时和分钟将是2016年10月10日结束日
package com.mkyong.date;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateDifferentExample
{
public static void main(String[] args)
{
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//get current date time with Date()
Date date = new Date();
System.out.println(dateFormat.format(date));
//get current date time with Calendar()
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));
String dateStart = "01/14/2012 09:29:58";
String dateStop = "01/15/2012 10:31:48";
//HH converts hour in 24 hours format (0-23), day calculation
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date d1 = null;
Date d2 = null;
try
{
d1 = format.parse(dateStart);
d2 = format.parse(dateStop);
//in milliseconds
long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000) % 24;
long diffDays = diff / (24 * 60 * 60 * 1000);
System.out.print(diffDays + " days, ");
System.out.print(diffHours + " hours, ");
System.out.print(diffMinutes + " minutes, ");
System.out.print(diffSeconds + " seconds.");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
结果:
2016/08/15 18:54:03
2016/08/15 18:54:03
1097 Days1 Hours 1 Minute 50 Second
My want to result for example :
100 days 5 hours 2 minutes
答案 0 :(得分:3)
您正在使用与最早版本的Java捆绑在一起的麻烦的旧旧日期时间类。请改用java.time类。
您的输入字符串几乎采用标准ISO 8601格式。用T
替换中间的SPACE。默认情况下,java.time类使用ISO 8601格式解析/生成字符串。因此无需指定格式化模式。
String startInput = "01/14/2012 09:29:58".replace( " " , "T" );
String stopInput = "01/15/2012 10:31:48".replace( " " , "T" );
LocalDateTime
您的输入缺少有关UTC或时区偏移的任何信息。所以我们解析为LocalDateTime
个对象。
LocalDateTime startLdt = LocalDateTime.parse( startInput );
LocalDateTime stopLdt = LocalDateTime.parse( stopInput );
如果您继续使用这些类型,您将获得基于通用24小时日的结果,同时忽略夏令时(DST)等异常情况。
如果您知道此数据的上下文是特定时区,请应用该区域以获取ZonedDateTime
。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime start = startLdt.atZone( zoneId );
ZonedDateTime stop = stopLdt.atZone( zoneId );
如果您想将当前时刻作为开始或停止,请致电now
。传递所需/预期的时区,而不是依赖于JVM当前的默认时区。
ZonedDateTime now = ZonedDateTime.now( zoneId );
Duration
类表示一个时间跨度,以秒为单位加上几分之一秒的纳秒分辨率。
Duration duration = Duration.between( start , stop );
奇怪的是,在Java 8中,这个类缺少方法来获得构成这段时间的天数,小时数等。 Java 9 adds to…Part
methods。
long days = duration.toDaysPart();
int hours = duration.toHoursPart();
int minutes = duration.toMinutesPart();
在Java 9之前,你可以自己做数学。
java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。
答案 1 :(得分:1)
public final void set(int year,int month,int date) - 这个Calendar类的方法可用于设置日期。
public final void set(int year,int month,int date,int hourOfDay,int minute,int second)也可用于设置时间。
Calendar.getInstance()默认情况下设置当前日期和时间。