在那里组织了一些由工作了两个日期之间的差值来计算的天,到例如使用了364天将是不同部分的一个办法:我想用逻辑运算符0年11个月,30天,小时,分钟等。可能工作如%和/,但不同月份有不同数量的天,有些年是闰年我不知道该怎么做。 任何帮助将非常感激。 我的代码:
import java.util.*;
public class CleanDate {
public static void main(String[] args) {
Calendar cDate = GregorianCalendar.getInstance();
cDate.set(2011, 0, 31, 00, 00, 00);
Date date1 = cDate.getTime();
Date date2 = new Date();
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
calendar1.setTime(date1);
calendar2.setTime(date2);
long milliseconds1 = calendar1.getTimeInMillis();
long milliseconds2 = calendar2.getTimeInMillis();
long diff = milliseconds2 - milliseconds1;
long diffSeconds = diff / 1000;
long diffMinutes = diff / (60 * 1000);
long diffHours = diff / (60 * 60 * 1000);
long diffDays = diff / (24 * 60 * 60 * 1000);
System.out.println("Time in minutes: " + diffMinutes + " minutes.");
System.out.println("Time in hours: " + diffHours + " hours.");
System.out.println("Time in days: " + diffDays + " days.");
}
}
你可以有效地使用约达时间是这样的: Interval
允许获得两个日期之间的时间间隔。
DateTime end = new DateTime(2006, 1, 1, 0, 0, 0, 0);
Interval interval = new Interval(start, end);
Period period = interval.toPeriod();
System.out.println(period.getYears()+" years, "
period.getMonths()+" months, "+period.getWeeks()+" weeks, "+period.getDays()+", days");
TL;博士
Duration.between( // Represent a span-of-time unattached to the timeline, on scale of days-hours-minutes-seconds.
ZonedDateTime // Represent a moment in the wall-clock time used by the people of a particular region (a time zone).
.of( 2011 , 1 , 31 , 0 , 0 , 0 , 0 , ZoneId.of( "Africa/Tunis" ) )
,
ZonedDateTime.of( … )
) // Returns a `Duration` object.
.toDaysPart() // Or `toHoursPart`, `toMinutesPart`, `toSecondsPart`, `toNanosPart`. These return either a `long` or an `int`.
java.time
现代的方法使用java.time类,而不是可怕的旧Date
和Calendar
类。 在看到的乔达时库对方的回答也被java.time取代。
指定日期和时间的日需要一个时间段,以确定确切时刻。 对于任何给定时刻在日期和时间的日由区全球各地有所不同。
指定适当的时区名称 ,格式为continent/region
,如America/Montreal
, Africa/Casablanca
,或Pacific/Auckland
。 切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,不规范,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
如果你想在一天的第一时刻,让java.time确定时间的日在该区域该日期。 每天不总是开始于00:00:00。
LocalDate ld = LocalDate.of( 2011 , Month.JANUARY , 31 ) ;
ZonedDateTime start = ld.atStartOfDay( z ) ; // Let java.time determine the first moment of the day. Never assume 00:00:00.
计算使用经过的天(实际时间24小时块),小时,分钟和秒的Duration
类。 多年来,月天(日历天,时间不是24小时块),使用Period
类。
ZonedDateTime stop = … ;
Duration d = Duration.between( start , stop ) ;
生成String
,在标准文本对象ISO 8601的格式。
String output = d.toString() ; // Generate standard ISO 8601 text.
PT2H3M42.725S
提取的各个部分。
long days = d.toDaysPart() ; // 24-hour chunks of time, *not* calendar days.
int hours = d.toHoursPart() ;
int minutes = d.toMinutesPart() ;
int seconds = d.toSecondsPart() ;
int nanos = d.toNanosPart() ; // Fractional second as a count of nanoseconds, from 0 to 999,999,999.
年,月,日与日小时 - 分 - 秒
如果你想想看,试图代表年,月,日,小时,分钟,秒来翼展的时间很少是有道理的。 这里涉及诸如日历日与时间24小时的块棘手的问题,而且事实上天长度如23,24,25或其它数量的时间长而变化。
但如果你真的坚持这种方法,添加ThreeTen-EXTRA库项目访问PeriodDuration
类。 此类尝试将两个概念结合起来。
在结合了周期和持续时间的ISO-8601日历系统的时间量。
该类机型在一段期限上一个数量或时间量。 一个时段是基于日期的量,包括年,月,日。 的持续时间是时间的基于时间的量,由秒和纳秒。 详情参见期和持续时间的类。
在一个周期的日子考虑夏令变化(23或25小时的日子)。 当执行计算时,时期首先加入,然后持续时间。
关于java.time
该java.time框架是建立在Java 8和更高版本。 这些类取代麻烦的老传统日期时间类,如java.util.Date
, Calendar
,和SimpleDateFormat
。
该乔达-时间的项目,现在在维护模式 ,建议迁移到java.time类。
要了解更多信息,请参阅甲骨文教程 。 和搜索堆栈溢出了很多例子和解释。 规范是JSR 310 。
您可以直接与数据库交换java.time对象。 使用JDBC驱动程序与兼容JDBC 4.2或更高版本。 无需串,没有必要java.sql.*
类。
从哪里获取java.time类?
- 的Java SE 8 , Java SE的9 , Java SE的10 , Java SE的11 ,后来-具有捆绑实现标准Java API的一部分。
- Java SE 6中和Java SE 7中
- 多的java.time功能后移植到Java 6和7在ThreeTen-反向移植 。
- Android的
- 后来版本的java.time类的Android束实现的。
- 对于较早的Android(<26),则ThreeTenABP项目适应ThreeTen-反向移植 (上面提到的)。 请参阅如何使用ThreeTenABP ... 。
该ThreeTen-额外项目与其他类扩展java.time。 该项目是为将来可能增加的java.time试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
文章来源: Organise number of days into separate sections for year, months, days, hours. Java