【问题标题】:How to subtract one date from an array of dates?如何从一组日期中减去一个日期?
【发布时间】:2014-01-05 23:17:28
【问题描述】:

所以,我有一组我向用户询问的日期。我想做一个经过天数的功能,通过检查经过的天数来删除某些条目。只有一个日期这不会太糟糕,但不幸的是我无法弄清楚如何用一系列日期来做到这一点。作为初学者,我可能会忽略一些基本的东西。

int[] dates;
int time;
int long;
Date now = new Date();

time = (int) (new Date().getTime() / 1000L);
diff = dates - time;

这最后一行代码显然不正确,并给了我一个错误。我该怎么做才能纠正这个问题?

感谢您容忍一个菜鸟。

【问题讨论】:

  • 您是将所有日期与一个其他日期(例如今天)进行比较,还是相互比较?换句话说,如果数组中的某些项发生的时间太早,您是否要删除它们?

标签: java arrays date time


【解决方案1】:

其他答案都是正确的。

  • 您没有正确处理数组,因为您必须循环遍历数组。
  • 您没有正确处理 Date 对象,因为无法使用 HYPHEN-MINUS “-” 字符减去它们。

学习

我建议做更多的研究。 Oracle 在线提供的免费 Java Tutorials 是一个很好的起点,Head First Java 书籍也是如此。


收藏

如果您愿意,可以在 Java 中使用基本数组,但 Collections 对象更有用。

乔达时间

您可以使用与 Java 捆绑在一起的 java.util.DateCalendar 类,但不推荐使用它们,因为设计和实现不好。 Joda-Time 是常用的开源第三方库。

在 Java 8 的未来,日期/日历类将被新的java.time.* classes 取代。这些课程受到 Joda-Time 的启发,但经过重新设计。

不需要过去

如果您只想查找太旧(或足够旧,您没有说是哪个)的输入日期,那么您不需要计算经过时间。相反,计算输入变得太旧的那一刻的日期时间。然后比较每个输入,看看它是在那一刻之前还是之后。

添加到新集合

另一个提示:不要删除您不想要的那些,只需将您想要的那些添加到 new 集合中。使您的代码更易于理解和调试。

标准格式

Joda-Time 默认使用标准ISO 8601 格式将日期时间呈现为字符串。您可以在下面的控制台输出中看到这一点。 Joda-Time 内置了许多其他格式,您也可以定义自己的格式。

示例代码

这里有一些示例代码可以帮助您进行操作。使用 Joda-Time 2.3,在 Java 7 中运行。

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );

java.util.List<DateTime> dateTimesInput = new ArrayList<DateTime>();
dateTimesInput.add( new DateTime( 2001, 2, 3, 4, 5, 6, timeZone ) );
dateTimesInput.add( new DateTime( 2014, 1, 5, 7, 8, 9, timeZone ) );
dateTimesInput.add( new DateTime( timeZone ).minusDays( 2 ) );

// Calculate the moment of a month ago, in desired time zone. Include all of that moment’s day, so go back to first moment of the day.
DateTime monthAgo = new DateTime( timeZone ).minusMonths( 1 ).withTimeAtStartOfDay();

// Loop the dates input. If any are less than a month old, keep them.
java.util.List<DateTime> keepers = new ArrayList<DateTime>();
for(DateTime dateTime: dateTimesInput){
    if( dateTime.isBefore( monthAgo ) ){
        // Ignore this date-time.
    } else {
        keepers.add( dateTime );
    }
}

// Dump to console.
System.out.println( "Month ago: " + monthAgo );
for(DateTime dateTime: keepers){
    System.out.println( dateTime );
}

运行时……

Month ago:2013-12-06T00:00:00.000+01:00
2014-01-05T07:08:09.000+01:00
2014-01-04T04:25:31.272+01:00

【讨论】:

    【解决方案2】:

    您需要遍历数组的元素,然后检查此数组中的每个 Date。那些可以的日期(即通过检查),您可以添加到 ArrayList。最后循环遍历 ArrayList 并根据需要处理这些。

    【讨论】:

      【解决方案3】:

      您必须遍历您的数组并检查每个单独的条目。 Google for 循环,例如 for,for each,do while。

      我还建议不要使用数组而是使用列表,使用列表可以通过调用 .Remove(object) 方法来删​​除无效条目。

      【讨论】:

        【解决方案4】:

        试试这个:

        Date now = new Date();
        
        Date[] datesFromUser = new Date[10];
        List<Date> newDatesList = new ArrayList<Date>();
        
        for(Date d: datesFromUser){
            if(d.getTime() > now.getTime()){
                newDatesList.add(d);
            }
        }
        
        Date[] dates = new Date[newDatesList.size()];
        int index = 0;
        for(Date d: newDatesList){
            dates[index++] = d;
        }
        

        【讨论】:

          猜你喜欢
          • 2013-08-12
          • 1970-01-01
          • 1970-01-01
          • 2010-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-19
          相关资源
          最近更新 更多