在 java 中找到两个 (Joda Time) DateTime 对象之间的确切差异
Find the exact difference between two (Joda Time) DateTime objects in java
我有两个日期(其中一个是现在),我需要找出两者之间的区别。我的代码给我错误的输出(有时甚至是负数)。
我尝试过使用月、日、秒、小时和年 类 并在方法之间适当使用,但没有成功。
编辑:
回到我原来的代码,但没有持续时间。 @Basil Bourque 发布了一个很好的解决方案,但我对 Periods/Duration 没有足够的经验,无法从它们动态格式化。
解决方案
public static String formattedTime(DateTime d){
DateTime present = new DateTime(Calendar.getInstance());
//dont really want to deal with WHY its 7hrs ahead. o well
DateTime date = d.minusHours(7);
int diff = Seconds.secondsBetween(date,present).getSeconds();
String postfix = "s";
Log.i("time", "" + diff);
if(diff>59){
diff = Minutes.minutesBetween(date, present).getMinutes();
postfix = "s";
if(diff>59){
diff = Hours.hoursBetween(date, present).getHours();
postfix = "hr";
if(diff>1)
postfix+="s";
if(diff>23){
diff = Days.daysBetween(date, present).getDays();
postfix = "d";
if(diff>6){
diff = Weeks.weeksBetween(date, present).getWeeks();
postfix = "wk";
if(diff>1)
postfix+="s";
if(diff>3){
diff = Months.monthsBetween(date, present).getMonths();
postfix = "m";
if(diff>11){
diff = Years.yearsBetween(date, present).getYears();
postfix = "yr";
if(diff>1)
postfix+="s";
}
}
}
}
}
}
return diff+postfix;
}
制作两个相互比较的字符串,可以用String#split()方法拆分,找出year/month/day等
您可以在这里看到答案:Number of days between two dates 并根据您的需要调整它。
你太辛苦了。您使用的 class 有误。
Period
Class
在 Joda-Time 中,当您想将时间跨度表示为年、月、日、小时、分钟、秒数时,请使用 Period
class。 Joda-Time 以三种方式中的任何一种表示时间跨度:Interval
、Duration
或 Period
.
Joda-Time 遵循 ISO 8601 标准来解析和生成日期时间值的字符串表示形式。对于 Period,这意味着 PnYnMnDTnHnMnS
格式,其中 P
标记开始,而 T
将年-月-日部分与时-分-秒部分分开。半小时是PT30M
。 P3Y6M4DT12H30M5S
代表"three years, six months, four days, twelve hours, thirty minutes, and five seconds"。搜索 whosebug.com 以获取更多信息和示例。
看看 PeriodFormatter
和 PeriodFormatterBuilder
classes 如果你想漂亮地打印文字。
如果需要整数,您也可以向 Period 对象询问各种组件编号。
时区
此外,您应该指定一个时区。如果省略,则隐式应用 JVM 当前的默认时区。最好明确指定您 desire/expect 的时区。
始终使用 proper time zone names,从不使用 3-4 字母代码。这些代码既不是标准化的也不是唯一的。他们进一步混淆了夏令时 (DST) 的问题。
此外,服务器通常保持 UTC 时区。通常最好在 UTC 中完成几乎所有的业务逻辑、数据存储、数据交换和日志记录。
示例代码
请注意,您可以在不涉及 java.util.Date 对象的情况下询问 DateTime
当前时刻(如您的问题所示)。
Period 的示例代码。
DateTimeZone zone = DateTimeZone.forID( "America/Detroit" ) ;
DateTime then = new DateTime( yourJUDate , zone ) ;
DateTime now = DateTime.now( zone ) ;
Period period = new Period( then , now ) ;
我有两个日期(其中一个是现在),我需要找出两者之间的区别。我的代码给我错误的输出(有时甚至是负数)。
我尝试过使用月、日、秒、小时和年 类 并在方法之间适当使用,但没有成功。
编辑: 回到我原来的代码,但没有持续时间。 @Basil Bourque 发布了一个很好的解决方案,但我对 Periods/Duration 没有足够的经验,无法从它们动态格式化。
解决方案
public static String formattedTime(DateTime d){
DateTime present = new DateTime(Calendar.getInstance());
//dont really want to deal with WHY its 7hrs ahead. o well
DateTime date = d.minusHours(7);
int diff = Seconds.secondsBetween(date,present).getSeconds();
String postfix = "s";
Log.i("time", "" + diff);
if(diff>59){
diff = Minutes.minutesBetween(date, present).getMinutes();
postfix = "s";
if(diff>59){
diff = Hours.hoursBetween(date, present).getHours();
postfix = "hr";
if(diff>1)
postfix+="s";
if(diff>23){
diff = Days.daysBetween(date, present).getDays();
postfix = "d";
if(diff>6){
diff = Weeks.weeksBetween(date, present).getWeeks();
postfix = "wk";
if(diff>1)
postfix+="s";
if(diff>3){
diff = Months.monthsBetween(date, present).getMonths();
postfix = "m";
if(diff>11){
diff = Years.yearsBetween(date, present).getYears();
postfix = "yr";
if(diff>1)
postfix+="s";
}
}
}
}
}
}
return diff+postfix;
}
制作两个相互比较的字符串,可以用String#split()方法拆分,找出year/month/day等
您可以在这里看到答案:Number of days between two dates 并根据您的需要调整它。
你太辛苦了。您使用的 class 有误。
Period
Class
在 Joda-Time 中,当您想将时间跨度表示为年、月、日、小时、分钟、秒数时,请使用 Period
class。 Joda-Time 以三种方式中的任何一种表示时间跨度:Interval
、Duration
或 Period
.
Joda-Time 遵循 ISO 8601 标准来解析和生成日期时间值的字符串表示形式。对于 Period,这意味着 PnYnMnDTnHnMnS
格式,其中 P
标记开始,而 T
将年-月-日部分与时-分-秒部分分开。半小时是PT30M
。 P3Y6M4DT12H30M5S
代表"three years, six months, four days, twelve hours, thirty minutes, and five seconds"。搜索 whosebug.com 以获取更多信息和示例。
看看 PeriodFormatter
和 PeriodFormatterBuilder
classes 如果你想漂亮地打印文字。
如果需要整数,您也可以向 Period 对象询问各种组件编号。
时区
此外,您应该指定一个时区。如果省略,则隐式应用 JVM 当前的默认时区。最好明确指定您 desire/expect 的时区。
始终使用 proper time zone names,从不使用 3-4 字母代码。这些代码既不是标准化的也不是唯一的。他们进一步混淆了夏令时 (DST) 的问题。
此外,服务器通常保持 UTC 时区。通常最好在 UTC 中完成几乎所有的业务逻辑、数据存储、数据交换和日志记录。
示例代码
请注意,您可以在不涉及 java.util.Date 对象的情况下询问 DateTime
当前时刻(如您的问题所示)。
Period 的示例代码。
DateTimeZone zone = DateTimeZone.forID( "America/Detroit" ) ;
DateTime then = new DateTime( yourJUDate , zone ) ;
DateTime now = DateTime.now( zone ) ;
Period period = new Period( then , now ) ;