我有开始日期和结束日期。这两个日期之间的持续时间应该是年、月和日的形式。我是新来的java。当我运行下面的方法时,我得到的结果是0年12个月1天。请建议一个替代方案,以获得年,月和天的准确差异。
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Duration {
private String getAssignmentDuration(java.util.Date oldDate, java.util.Date newDate) {
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
if (oldDate.compareTo(newDate) > 0) {
c1.setTime(newDate);
c2.setTime(oldDate);
} else {
System.out.println("invalid");
return "Invalid selection";
}
int year = 0;
int month = 0;
int days = 0;
boolean doneMonth = false;
boolean doneYears = false;
while (c1.before(c2)) {
//log.debug("Still in Loop");
if (!doneYears) {
c1.add(Calendar.YEAR, 1);
year++;
}
if (c1.after(c2) || doneYears) {
if (!doneYears) {
doneYears = true;
year--;
c1.add(Calendar.YEAR, -1);
}
if (!doneMonth) {
c1.add(Calendar.MONTH, 1);
month++;
}
if (c1.after(c2) || doneMonth) {
if (!doneMonth) {
doneMonth = true;
month--;
c1.add(Calendar.MONTH, -1);
}
c1.add(Calendar.DATE, 1);
days++;
if (c1.after(c2)) {
days--;
}
// this will not be executed
if (days == 31 || month==12) {
break;
}
}
}
}
System.out.println(year + " years, " + month + " months, " + days + " days");
return year + " years, " + month + " months, " + days + " days";
}
public static void main(String[] args) {
Duration d1= new Duration();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
java.util.Date oldDate = null;
try {
oldDate = sdf.parse("2012/08/29");
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
java.util.Date newDate = null;
try {
newDate = sdf.parse("2013/08/31");
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
d1.getAssignmentDuration(oldDate, newDate);
}
}
Period.between(
LocalDate.of( 2017 , Month.JANUARY , 23 ) ,
LocalDate.of( 2017 , Month.MARCH , 27 )
)
呼叫:
.getYears()
.getMonths()
.getDays()
您使用的是麻烦的旧日期时间类,现在是遗留的,被java取代。时间课。
LocalDate
类表示一个只有日期的值,没有一天中的时间,也没有时区。
时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,法国巴黎午夜过后几分钟是新的一天,而魁北克山仍然是“昨天”。
以大陆/地区
的格式指定适当的时区名称,例如美国/蒙特利尔
,非洲/卡萨布兰卡
,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
今天toString():2017-05-05
对于我们的示例,我们创建另一个LocalDate
。
LocalDate earlier = today.minusMonths( 2 ).minusWeeks( 3 ).minusDays( 2 ) ;
earlier.toString(): 2017-02-10
若要以年-月-日粒度表示未附加到时间轴的时间跨度,请使用周期
类。
Period p = Period.between( earlier , today ) ;
int years = p.getYears();
int months = p.getMonths();
int days = p.getDays();
查看此代码在IdeOne上的实时运行。通用域名格式。
ISO 8601标准定义了日期时间值的文本表示格式。对于年-月-日的持续时间,模式为PnYnMnDTnHnMnS
,其中P
标记开始,而T
将年-月-日部分与时-分-秒部分分开。
java.time类在解析/生成字符串时默认使用标准格式。类在其toString方法中生成这个特定的模式。
String output = p.toString() ;
p、 toString():P2M25D
Joda Time有一个可以使用的时间间隔概念,如:
Interval interval = new Interval(oldDate.getTime(), newDate.getTime());
然后使用句点对象,如:
Period period = interval.toPeriod().normalizedStandard(PeriodType.yearMonthDay());
PeriodFormatter formatter = new PeriodFormatterBuilder()
.appendYears()
.appendSuffix(" year ", " years ")
.appendSeparator(" and ")
.appendMonths()
.appendSuffix(" month ", " months ")
.appendSeparator(" and ")
.appendDays()
.appendSuffix(" day ", " days ")
.toFormatter();
System.out.println(formatter.print(period));
你将很容易地在几年或几个月内打印出你的差异。
可能你在发布问题时改变了一些东西,因为要修复你的代码(注意,我没有测试你的代码是否适用于所有类型的范围),你只需要正确初始化日历对象,并反向无效的选择检查:
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
if (oldDate.compareTo(newDate) < 0) {
c2.setTime(newDate);
c1.setTime(oldDate);
} else {
System.out.println("invalid");
return "Invalid selection";
}
public static String getDateDifferenceInDDMMYYYY(Date from, Date to) {
Calendar fromDate=Calendar.getInstance();
Calendar toDate=Calendar.getInstance();
fromDate.setTime(from);
toDate.setTime(to);
int increment = 0;
int year,month,day;
System.out.println(fromDate.getActualMaximum(Calendar.DAY_OF_MONTH));
if (fromDate.get(Calendar.DAY_OF_MONTH) > toDate.get(Calendar.DAY_OF_MONTH)) {
increment =fromDate.getActualMaximum(Calendar.DAY_OF_MONTH);
}
System.out.println("increment"+increment);
// DAY CALCULATION
if (increment != 0) {
day = (toDate.get(Calendar.DAY_OF_MONTH) + increment) - fromDate.get(Calendar.DAY_OF_MONTH);
increment = 1;
} else {
day = toDate.get(Calendar.DAY_OF_MONTH) - fromDate.get(Calendar.DAY_OF_MONTH);
}
// MONTH CALCULATION
if ((fromDate.get(Calendar.MONTH) + increment) > toDate.get(Calendar.MONTH)) {
month = (toDate.get(Calendar.MONTH) + 12) - (fromDate.get(Calendar.MONTH) + increment);
increment = 1;
} else {
month = (toDate.get(Calendar.MONTH)) - (fromDate.get(Calendar.MONTH) + increment);
increment = 0;
}
// YEAR CALCULATION
year = toDate.get(Calendar.YEAR) - (fromDate.get(Calendar.YEAR) + increment);
return year+"\tYears\t\t"+month+"\tMonths\t\t"+day+"\tDays";
}
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.set(1999,01,8);
/* Calendar calendar1 = Calendar.getInstance();
calendar1.set(2012,01,23);*/
System.out.println(getDateDifferenceInDDMMYYYY(calendar.getTime(),new Date()));
}
我已经搜索了4个小时了,但是还没有找到一个用JavaScript计算两个日期(年、月和天)之间差异的解决方案,比如:2010年4月10日是3年、x月和y天之前。 有很多解决方案,但它们只提供了日、月或年的格式差异,或者它们不正确(意味着没有考虑一个月或闰年的实际天数,等等)。做那件事真的有那么难吗? 我看了一下: http://momentjs.com/->只能输出年、月或天的差异 http://
我试图在我正在创建的C#应用程序中显示两个日期之间的年、月和日。(使用控制台进行测试) 我正在使用NodaTime来实现这一点,但在接下来的几个月里,我遇到了一些问题。 我已经阅读了这里的大部分问题和答案,但没有找到任何我可以从中受益的东西。 大多数时候函数工作但有时它不添加月如果天 我使用这个代码进行测试 (2017, 10, 16)和(2018, 1, 15)应该显示为3个月,但它们显示为2个
假设我有:Employee模型,它的属性变量是startDate,促销模型的属性变量是promotionDate。我想知道员工升职前工作了多长时间,我必须找出升职日期和开始日期之间的差异。如果我是员工的话。getStartDate()和promotionDate作为促销。getPromotionDate,如何查找任何日期的年、月和日的差异, 任何帮助都将不胜感激。 更新:我解决了以下问题 非常感谢
嗯,我在这里发现了很多这样的问题,试图获得年、月和日的两个日期之间的差异。。。但没有满足我要求的答案。 所以我写了一些计算的东西,它似乎是有效的,但也许这里的一些专家可以进行更正,或者帮助使这更简单。
我有两次约会。一个是以YYYYMMDD格式从其他应用程序的表中检索的,第二个日期是本地时间,我需要这两个日期之间的天数/月/年。 我试过了 但这给了我一些乱七八糟的数字。 变量$t=Fri Dec31 00:00:00 9999 变量$今天=Wed Feb19 14:40:55 2020 产出:25182094888 有什么想法吗?提前谢谢。
问题内容: 我有以下代码可以成功获取两天之间的差异(以天,小时,分钟,秒为单位): 但是,当日期跨入另一个月份时,这将不起作用,例如: 是否可以智能地跨越几个月并获得准确的时差?我对Joda熟悉,但是我想坚持使用标准Java API,除非没有Joda这样的东西是不可能的。 问题答案: 您正在使用 应该 您会得到正确的结果 这是日期模式的javadoc。是每月的一天。是一年中的一天。您的对象只是没有