Java 如何获得从现在到将来的月、周、日和小时数?
我需要使用Java找出从现在到将来剩下的月、周、日和小时数。我不能使用任何像Joda这样的第三方库。仅使用JDK类如何实现这一点 到目前为止,这就是我想到的。除了某些情况外,它在某种程度上是有效的:Java 如何获得从现在到将来的月、周、日和小时数?,java,Java,我需要使用Java找出从现在到将来剩下的月、周、日和小时数。我不能使用任何像Joda这样的第三方库。仅使用JDK类如何实现这一点 到目前为止,这就是我想到的。除了某些情况外,它在某种程度上是有效的: public class DateUtil { public static Integer[] components(Date from, Date to) { Integer[] result = new Integer[4]; //SimpleDateFormat df = n
public class DateUtil {
public static Integer[] components(Date from, Date to) {
Integer[] result = new Integer[4];
//SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//df.setTimeZone(TimeZone.getTimeZone("EST"));
Calendar fromCal = new GregorianCalendar();
Calendar toCal = new GregorianCalendar();
fromCal.setTime(from);
toCal.setTime(to);
int months = 0;
do {
fromCal.add(Calendar.MONTH, 1);
++months;
//System.out.println(df.format(fromCal.getTime()));
} while (fromCal.before(toCal));
fromCal.add(Calendar.MONTH, -1);
--months;
int days = 0;
do {
fromCal.add(Calendar.DAY_OF_YEAR, 1);
++days;
} while (fromCal.before(toCal));
fromCal.add(Calendar.DAY_OF_YEAR, -1);
--days;
int hours = 0;
do {
fromCal.add(Calendar.HOUR_OF_DAY, 1);
++hours;
} while (fromCal.before(toCal));
fromCal.add(Calendar.HOUR_OF_DAY, -1);
--hours;
int minutes = 0;
do {
fromCal.add(Calendar.MINUTE, 1);
++minutes;
} while (fromCal.before(toCal));
result[0] = months;
result[1] = days;
result[2] = hours;
result[3] = minutes;
return result;
}
public static void main(String[] args) {
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
df.setTimeZone(TimeZone.getTimeZone("EST"));
Date from = df.parse("2014-03-29 00:00");
Date to = df.parse("2014-05-29 00:00");
Integer result[] = components(from, to);
System.out.printf("Months:%02d Days:%02d Hrs:%02d Mins:%02d\n",
result[0], result[1], result[2], result[3]);
} catch (Exception e) {
e.printStackTrace();
}
}
}
当你有二月中旬开始日期是月末时,它会产生不可接受的结果。例如:
起始日期:2013年12月31日
至:2014年12月31日
差异将产生:12个月,3天。为什么不使用Java类和
这些类已经具有内置功能,可以帮助您计算两个日期之间的差异。大多数Date方法似乎都被弃用了,所以我建议改为Calendar。祝你好运 为什么不使用Java类和
这些类已经具有内置功能,可以帮助您计算两个日期之间的差异。大多数Date方法似乎都被弃用了,所以我建议改为Calendar。祝你好运 我的一位同事最终找到了正确的答案。在日历中增加一个月的问题是,从1月31日到2月28日再到3月28日,而不是3月31日。这增加了准确性。解决方案是在原始开始日期的基础上增加1个月、2个月、3个月等等。然后从1月31日到2月28日再到3月31日。无论如何,这是他的解决方案,我稍微改变了一下
public class TimeSpan {
public int months;
public int days;
public int hours;
public int minutes;
}
class DateCalculator {
public static TimeSpan difference(Date later, Date earlier) {
TimeSpan v = new TimeSpan();
/* Add months until we go past the target, then go back one. */
while (calculateOffset(earlier, v).compareTo(later) <= 0) {
v.months++;
}
v.months--;
/* Add days until we go past the target, then go back one. */
while (calculateOffset(earlier, v).compareTo(later) <= 0) {
v.days++;
}
v.days--;
/* Add hours until we go past the target, then go back one. */
while (calculateOffset(earlier, v).compareTo(later) <= 0) {
v.hours++;
}
v.hours--;
while (calculateOffset(earlier, v).compareTo(later) <= 0) {
v.minutes++;
}
v.minutes--;
return v;
}
private static Date calculateOffset(Date start, TimeSpan offset) {
Calendar c = new GregorianCalendar();
c.setTime(start);
c.add(Calendar.MONTH, offset.months);
c.add(Calendar.DAY_OF_YEAR, offset.days);
c.add(Calendar.HOUR, offset.hours);
c.add(Calendar.MINUTE, offset.minutes);
return c.getTime();
}
public static void main(String[] args) {
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
df.setTimeZone(TimeZone.getTimeZone("EST"));
Date from = df.parse("2013-01-31 00:00");
Date to = df.parse("2014-01-31 10:20");
TimeSpan ts = difference(to, from);
System.out.printf("Months:%02d Days:%02d Hrs:%02d Mins:%02d\n",
ts.months, ts.days, ts.hours, ts.minutes);
} catch (Exception e) {
e.printStackTrace();
}
}
}
公共类时间跨度{
公众月数;
公众假期;
公共时间;
公开会议记录;
}
类日期计算器{
公共静态时间跨度差异(日期较晚,日期较早){
TimeSpan v=新的TimeSpan();
/*再加上几个月,直到我们超过目标,然后返回一个月*/
while(calculateOffset(前面,v).compareTo(后面)我的一位同事最终给出了正确的答案。在日历中增加一个月的问题是,从1月31日到2月28日再到3月28日,而不是3月31日。这增加了不准确度。解决方法是在原始开始日期的基础上增加1个月、2个月、3个月等等。然后从1月31日到2月28日再到3月31日。无论如何,这是他的解决方案,我稍微改变了一下
public class TimeSpan {
public int months;
public int days;
public int hours;
public int minutes;
}
class DateCalculator {
public static TimeSpan difference(Date later, Date earlier) {
TimeSpan v = new TimeSpan();
/* Add months until we go past the target, then go back one. */
while (calculateOffset(earlier, v).compareTo(later) <= 0) {
v.months++;
}
v.months--;
/* Add days until we go past the target, then go back one. */
while (calculateOffset(earlier, v).compareTo(later) <= 0) {
v.days++;
}
v.days--;
/* Add hours until we go past the target, then go back one. */
while (calculateOffset(earlier, v).compareTo(later) <= 0) {
v.hours++;
}
v.hours--;
while (calculateOffset(earlier, v).compareTo(later) <= 0) {
v.minutes++;
}
v.minutes--;
return v;
}
private static Date calculateOffset(Date start, TimeSpan offset) {
Calendar c = new GregorianCalendar();
c.setTime(start);
c.add(Calendar.MONTH, offset.months);
c.add(Calendar.DAY_OF_YEAR, offset.days);
c.add(Calendar.HOUR, offset.hours);
c.add(Calendar.MINUTE, offset.minutes);
return c.getTime();
}
public static void main(String[] args) {
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
df.setTimeZone(TimeZone.getTimeZone("EST"));
Date from = df.parse("2013-01-31 00:00");
Date to = df.parse("2014-01-31 10:20");
TimeSpan ts = difference(to, from);
System.out.printf("Months:%02d Days:%02d Hrs:%02d Mins:%02d\n",
ts.months, ts.days, ts.hours, ts.minutes);
} catch (Exception e) {
e.printStackTrace();
}
}
}
公共类时间跨度{
公众月数;
公众假期;
公共时间;
公开会议记录;
}
类日期计算器{
公共静态时间跨度差异(日期较晚,日期较早){
TimeSpan v=新的TimeSpan();
/*再加上几个月,直到我们超过目标,然后返回一个月*/
while(calculateOffset(前面,v).compareTo(后面)你为什么不能使用Joda?你可以试着看一看,有一些想法,我认为对于那些不了解本网站规范的新手来说,不需要投否决票。这里会有一篇帖子,上面有一些演示,新来者在被否决之前都不知道这一点。请参考并进一步增强你的逻辑。RajV,你是错。Mike W完全正确地指出,你在问题中没有提供足够的信息,他没有做出尖刻的评论。他不是一个读心术的人,如果你不告诉他,他不知道你在使用日期和日历方面有多棒。Polywhill先生提供的解决方案可以简单地修改以解决你的使用问题e、 如果你在这方面需要帮助,就请求帮助。不要说他的贡献毫无用处,这只会让你看起来像是那种没人愿意帮助的人。为什么你不能使用Joda?你可以试着看一看,有一些想法,我认为对于那些不了解本网站规范的新手来说,不需要投否决票。发布帖子是可以的在这里观看了一些演示,新来者在被否决之前从未意识到这一点。请参考并进一步加强你的逻辑。拉杰夫,你错了。迈克W绝对正确地指出,你在你的问题中没有提供足够的信息,他没有做出尖刻的评论。他不是一个读心术者,他不知道如何做如果你不告诉他,你在使用日期和日历方面真是太棒了。Polywhill先生提供的解决方案可以简单地修改,以解决你的用例。如果你需要帮助,就请求帮助。不要说他的贡献毫无用处,它只会让你看起来像那种没人愿意帮助的人。+1提倡使用日历
在被弃用的日期
类上。从什么时候起,日期
被弃用了?它的许多方法都有,但类本身没有。+1提倡在被弃用的日期
类上使用日历。日期
从什么时候开始被弃用了?它的许多方法都有,但类本身没有ot。