【问题标题】:How to sort the dates from current to old date in Android or Java?如何在 Android 或 Java 中对日期从当前日期到旧日期进行排序?
【发布时间】:2012-12-27 05:49:38
【问题描述】:

我需要一个用户定义的函数,它可以将日期从当前时间排序到旧时间。

我有 10 个日期的列表,我想从最近的日期开始对这些日期进行排序。

目前我有一个逻辑,如果我们可以转换 以毫秒为单位的日期,那么将它与 current-milli-seconds 进行比较,最小的毫秒将是最近的日期。 也就是说,

CURRENT_MILLI_SECOND - A_DATE_CONVERTED_TO_MILLI_SECONDS = MILLI-SECONDS

如果有人可以在这个逻辑或任何其他逻辑上帮助我,请建议我...!!!

这是我从服务器获取的格式:

Thu Dec 27 11:02:43 GMT+05:30 2012

【问题讨论】:

标签: java android date


【解决方案1】:

您可以使用Comparator 并可以使用compare() 对数据进行排序

Collections.sort(dateList, new Comparator<Date>(){
           public int compare(Date date1, Date date2){
          return date1.after(date2);
        }
      });

【讨论】:

  • 所以如果我有 10 个日期在一个列表中,那么我如何使用这种方法来获取最近的日期......!!!
  • 非常感谢,我也可以在 Android 中使用它吗??
  • 您可以使用 Collections 类并使用 Comparator 对列表进行排序,是的,您也可以在 Android 中使用。
  • 如果您有以毫秒为单位的日期,请将其放入字符串中,并将相同的值传递给比较方法。这样,您将按照毫秒对日期进行排序。
  • 仅供参考,java.util.Date、java.util.Calendar 和 java.text.SimpleDateFormat 等麻烦的旧日期时间类现在已被 java.time 类所取代。在ThreeTen-Backport 项目中,大部分 java.time 功能都向后移植到 Java 6 和 Java 7。在ThreeTenABP 项目中进一步适用于早期的Android。见How to use ThreeTenABP…。
【解决方案2】:

tl;博士

Collections.reverse(
    new ArrayList<>().add( 
        OffsetDateTime.parse( 
            "Thu Dec 27 11:02:43 GMT+05:30 2012" , 
            DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss OOOO uuuu" , Locale.US  ) 
        ) 
    )
)

java.time

现代方法使用 java.time 类。

定义要匹配的格式模式。顺便说一句,这是一种可怕的格式;如果您有任何控制权,请改用标准的ISO 8601 格式。

String input = "Thu Dec 27 11:02:43 GMT+05:30 2012" ;

DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss OOOO uuuu" , Locale.US  );

您的输入字符串指定了与 UTC 的偏移量,但不是完整的时区。所以我们解析为OffsetDateTime。

OffsetDateTime odt = OffsetDateTime.parse( input , f );

odt.toString(): 2012-12-27T11:02:43+05:30

OffsetDateTime 对象已经知道如何使用sort themselves,因为它们实现了Comparable。

List< OffsetDateTime > odts = new ArrayList<>( 3 ) ;
odts.add( odt ) ;
odts.add( odt.plusMinutes( 7 ) ) ;
odts.add( odt.minusMinutes( 21 ) ) ;

Collections.sort( odts ) ;

您希望最新的在列表顶部,所以sort in reverse order。

Collections.reverse( odts ) ;  // Reverse-order.

要比较单个 java.time 对象,请调用 isBefore、isAfter 和 isEqual/equals 方法。

thisOdt.isBefore( thatOdt )

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

从哪里获得 java.time 类?

【讨论】:

    【解决方案3】:

    试试这个:

     Comparator date_comparator = new Comparator() {
        @Override
        public int compare(Date date1, Date date2){
        return date1.compareTo(date2);
        }
        };
    

    【讨论】:

    • 与接受的答案不同,这实际上可以编译和工作。
    【解决方案4】:

    您可以使用Calendar 或Date 类来执行此操作。使用日历和日期,您可以比较两个日期,例如 date1.compare(date2) 或 date.before(date2) 或 date1.after(date2) 此类 api 可用于您的案例。

    【讨论】:

      【解决方案5】:

      Java 中的 Date 和 Calendar 类已经有一个很好的 API 来比较日期。

      您可以使用它来编写您自己的日期排序函数。

      您可以参考this link。

      【讨论】:

      • 这里是一个使用 Calendar Collections.sort(drawings,new Comparator() { @Override public int compare(Object o, Object t1) { return ((Drawing)t1).getCalendar() 的示例。 compareTo(((绘图)o).getCalendar()); } });
      【解决方案6】:

      有我的gist 可以帮助你。您只需要在 SortedDateGenerator.getSortedDates(List&lt;String&gt; unSortedDate,String datePattern) 的参数中传递未排序的日期字符串和日期模式 函数然后你会得到排序日期的字符串。如果您需要 Date 对象,那么您可以根据需要修改我的代码。

      【讨论】:

        【解决方案7】:

        只需调用getSortedDateList 方法即可根据您的要求对日期进行排序

        private ArrayList<Date> getSortedDateList(ArrayList<Date> dateList) {
                //Replace year with current year to sort in jan to dec order
                for(int i = 0; i < dateList.size(); i++) {
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTime(dateList.get(i));
                    calendar.set(Calendar.YEAR, Calendar.getInstance().get(Calendar.YEAR));
                    dateList.set(i, calendar.getTime());
                }
                //Sort all dates in ascending order
                Collections.sort(dateList);
                //Get final index of past dates
                int index = 0;
                for (int i = 0; i < dateList.size(); i++) {
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTime(dateList.get(i));
                    calendar.set(Calendar.YEAR, Calendar.getInstance().get(Calendar.YEAR));
                    Calendar today = Calendar.getInstance();
                    today.set(Calendar.DATE, Calendar.getInstance().get(Calendar.DATE) - 1);
                    if (calendar.getTime().after(today.getTime())) {
                        index = i;
                        break;
                    }
                }
                //New list for storing upcoming dates
                ArrayList<Date> newList = new ArrayList<>();
                
                //Store upcoming dates in new list
                for (int i = index; i < dateList.size(); i++) {
                    newList.add(dateList.get(i));
                }
                //Store past dates in new list
                for (int i = 0; i < index; i++) {
                    newList.add(dateList.get(i));
                }
                Collections.copy(dateList, newList);
                return dateList;
            }
        

        例如,将一些样本日期存储到数组列表中并调用getSortedDateList方法

        SimpleDateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy"); // Your date format
                
        ArrayList<Date> dateList = new ArrayList<>();
        dateList.add(formatter.parse("Thu May 25 00:00:00 GMT+05:30 2000"));
        dateList.add(formatter.parse("Tue Apr 18 00:00:00 GMT+05:30 2021"));
        dateList.add(formatter.parse("Wed Jan 27 00:00:00 GMT+05:30 1997"));
        dateList.add(formatter.parse("Sat Feb 22 00:00:00 GMT+05:30 2020"));
        dateList.add(formatter.parse("Mon Dec 20 00:00:00 GMT+05:30 2001"));
        dateList.add(formatter.parse("Thu Jun 14 00:00:00 GMT+05:30 2009"));
        dateList.add(formatter.parse("Sat Mar 01 00:00:00 GMT+05:30 1999"));
        dateList.add(formatter.parse("Sat Nov 07 00:00:00 GMT+05:30 2005"));
                
        dateList = getSortedDateList(dateList);
                
        for(Date date: dateList) {
            System.out.println(date.toString());
        }
        

        如果当前日期为Feb 01 2021,则最终输出如下所示

        Mon Feb 22 00:00:00 IST 2021
        Mon Mar 01 00:00:00 IST 2021
        Sun Apr 18 00:00:00 IST 2021
        Tue May 25 00:00:00 IST 2021
        Mon Jun 14 00:00:00 IST 2021
        Sun Nov 07 00:00:00 IST 2021
        Mon Dec 20 00:00:00 IST 2021
        Wed Jan 27 00:00:00 IST 2021
        

        【讨论】:

          猜你喜欢
          • 2019-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-06
          • 2019-03-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多