将天数组织为年、月、日、小时的单独部分。JAVA
是否有一种方法可以通过计算两个日期之间的差值将天数组织成不同的部分,例如364天的天数为:0年、11个月、30天、小时、分钟等。 我认为使用逻辑运算符可能会像%和/或那样工作,但由于不同的月份有不同的天数,有些年份是闰年,我不确定如何做到这一点。任何帮助都将不胜感激。我的代码:将天数组织为年、月、日、小时的单独部分。JAVA,java,date,calendar,gregorian-calendar,Java,Date,Calendar,Gregorian Calendar,是否有一种方法可以通过计算两个日期之间的差值将天数组织成不同的部分,例如364天的天数为:0年、11个月、30天、小时、分钟等。 我认为使用逻辑运算符可能会像%和/或那样工作,但由于不同的月份有不同的天数,有些年份是闰年,我不确定如何做到这一点。任何帮助都将不胜感激。我的代码: import java.util.*; public class CleanDate { public static void main(String[] args) { Calendar c
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.");
}
}
你可以这样有效地利用Joda的时间:
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;博士
java.time
现代方法使用java.time类,而不是可怕的老式Date
&Calendar
类。中的Joda时间库也被java.Time取代
指定日期和时间需要时区来确定确切的时刻。对于任何给定的时刻,一天中的日期和时间在全球各地因区域而异
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
如果您想要一天中的第一个时刻,让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小时的时间段)、小时、分钟和秒。对于年-月-日(日历日,而不是24小时的时间段),使用类
生成带有标准格式文本的字符串
对象
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或其他小时数
但是,如果您确实坚持这种方法,请将库添加到项目中以访问该类。本课程试图结合这两个概念
ISO-8601日历系统中的时间量,它结合了一个期间和一个持续时间
此类根据时段和持续时间对时间的数量或数量进行建模。期间是基于日期的时间量,由年、月和日组成。持续时间是基于时间的时间量,由秒和纳秒组成。有关详细信息,请参见时段和持续时间类
时段中的天数考虑了夏令时的更改(23或25小时天)。执行计算时,先添加时段,然后添加持续时间
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(学习并使用JODA time。这不是一个好主意。一个时间段有多长,比如说,“两个月,十一天”?我希望时间段由用户定义,因此用户输入一个日期,并输出自该日期起的年、月、日。我将查看joda time。感谢您的帮助。顺便说一句,不要在文字数字上使用前导零,因为在Java.FYI中,该项目现在处于,团队建议迁移到类。请参阅。
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.
ZonedDateTime stop = … ; Duration d = Duration.between( start , stop ) ;
String output = d.toString() ; // Generate standard ISO 8601 text.
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.