gpt4 book ai didi

java - Collection.sort by Date 不适用于所有设备

转载 作者:行者123 更新时间:2023-12-01 19:35:37 28 4
gpt4 key购买 nike

我正在尝试使用 Collection.sort 使用 Dates 按 ASC 顺序对一些数组进行排序;但是当我在几台设备上进行一些测试时,它只能在平板电脑上正常工作,而不能在手机上工作。平板安卓版是8.1,手机版,一个是5.0.1,一个是9.0。

当我比较日期 AS 字符串时,collection.sort() 在每个设备上都可以正常工作,但它不会重新排列我需要的方式,例如:我需要按 Asc 顺序排列的客户列表,例如:30/08/2019、31/08/2019 , 02/09/2019 但比较字符串是这样的:02/09/2019, 30/08/2019, 31/08/2019。我希望我的解释可以理解

//clientsParent 模型中有几个我需要排序的数组

  ClientModel client = new ClientModel();
client.setFechaGestion(Utilities.convertStringToDate("02/09/2019 02:20:00 PM"));

clientsParent.get(parentIndex).getClients().add(client);

Collections.sort(clientsParent.get(parentIndex).getClients(), (c1, c2) ->
c1.getFechaGestion().compareTo(c2.getFechaGestion()));



adapter.notifyDataSetChanged();


这是我的 Utilities 类中的方法,在该方法中,我将来自 Web 服务的 JSON 给出的字符串转换为更精确的排序。
  public static Date convertStringToDate(String date){
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss aa");
Date convertedDate = new Date();
try {
convertedDate = dateFormat.parse(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return convertedDate;
}

编辑

通过阅读评论和研究这确实是一个区域设置问题,如果您在项目中遇到此类问题,您唯一需要做的就是添加一个区域设置作为第二个参数,如果您在您可以使用其构造函数实例化一个默认列表,例如:
  Locale localSpanish = new Locale("es", "ES");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss aa", localSpanish);
Date convertedDate = new Date();
try {
convertedDate = dateFormat.parse(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return convertedDate;

PD :正如在这篇文章中回答的那样,尝试不使用 Date 和 SimpleDateFormat

最佳答案

tl;博士

  • 切勿使用 Date & SimpleDateFormat
  • LocalDateTime 是适合您的类(class),因为您输入了日期和时间,但没有时区或与 UTC 的偏移量
  • 实现 Comparable 类上的接口(interface),或传递 Comparator Collections.sort .
  • 实现compareTo方法,只需询问 LocalDateTime比较自己的对象,因为该类实现了 compareTo . this.when.compareTo( that.when )

  • ISO 8601

    "02/09/2019 02:20:00 PM"



    将日期时间值作为文本交换时,请始终使用标准 ISO 8601格式。使用 24-hour clock而不是上午/下午。

    例如:`2019-09-02T14:20:00"

    I convert the strings given by the JSON from the web service



    让 Web 服务的发布者了解 ISO 8601 的好处。 .

    避免遗留的日期时间类

    您正在使用糟糕的日期时间类(class)。这些在几年前被采用定义现代 java.time 类的 JSR 310 所取代。

    切勿使用 SimpleDateFormatDate .

    智能对象,而不是愚蠢的字符串

    collection.sort() works fine in every device when I compare the dates AS Strings



    不,不要将日期时间值存储为文本。我们有这方面的类(class)。
    LocalDateTime
    定义格式模式以匹配输入字符串,因为您没有使用 ISO 8601格式。

    注意我们如何传递 Locale指定用于翻译 AM 的人类语言和文化规范/ PM .
    DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu hh:mm:ss a" ).withLocale( Locale.US ) ;

    解析字符串。
    LocalDateTime ldt = LocalDateTime.format( input , f ) ;

    使用 LocalDateTime 作为您的类(class)成员字段的类型,而不是 String . LocalDateTime对象知道如何排序,已实现 Comparable .

    请注意 LocalDateTime不代表片刻 .缺少时区或偏移的上下文,它只存储日期和时间。如果您尝试跟踪时间轴上的特定点,您应该使用 Instant , OffsetDateTime , 或 ZonedDateTime .使用 LocalDateTime仅用于在我们想要保持特定时间的情况下预订 future 的约会,而不管政客改变该地区使用的偏移量。

    Table of date-time types in Java, both modern and legacy.

    示例应用

    简单的例子。不一定足够强大以供生产使用。

    定义持有 LocalDateTime 的类目的。
    class Event implements Comparable< Event > {
    // Member field variable.
    public LocalDateTime when ;

    // Constructor
    public Event( LocalDateTime localDateTime ) {
    this.when = localDateTime ;
    }

    // Implements `Comparable` interface.
    @Override
    public int compareTo( Event that ) {
    return this.when.compareTo( that.when ) ;
    }

    // Override `Object.toString` for better reporting of the value of this object.
    @Override
    public String toString() {
    return this.when.toString() ;
    }
    }

    以及 main 中的示例用法方法。
    import java.util.*;
    import java.lang.*;
    import java.io.*;

    import java.time.* ;
    import java.time.format.* ;
    import java.time.temporal.* ;

    class Ideone
    {
    public static void main (String[] args) throws java.lang.Exception
    {
    List< Event > events = new ArrayList<>( 3 ) ;
    events.add( new Event( LocalDateTime.of( 2019 , 3 , 14 , 12 , 0 , 0 , 0 ) ) ) ;
    events.add( new Event( LocalDateTime.of( 2019 , 1 , 17 , 14 , 0 , 0 , 0 ) ) ) ;
    events.add( new Event( LocalDateTime.of( 2019 , 2 , 21 , 17 , 0 , 0 , 0 ) ) ) ;
    System.out.println("Before: " + events ) ;

    Collections.sort( events ) ;
    System.out.println("After: " + events ) ;
    }
    }

    看到这个 code run live at IdeOne.com .

    Before: [2019-03-14T12:00, 2019-01-17T14:00, 2019-02-21T17:00]

    After: [2019-01-17T14:00, 2019-02-21T17:00, 2019-03-14T12:00]



    关于 java.time

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

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

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

    您可以直接与您的数据库交换 java.time 对象。使用 JDBC driver符合 JDBC 4.2或更晚。不需要字符串,不需要 java.sql.*类。

    从哪里获得 java.time 类?
  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 , 和更高版本 - 标准 Java API 的一部分,具有 bundle 的实现。
  • Java 9 添加了一些小功能和修复。
  • Java SE 6Java SE 7
  • 大多数 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7。 .
  • Android
  • java.time 类的更高版本的 Android bundle 实现。
  • 对于早期的 Android (<26),ThreeTenABP项目适应ThreeTen-Backport (上文提到的)。见 How to use ThreeTenABP… .
  • 关于java - Collection.sort by Date 不适用于所有设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57761144/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com