有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java列表中最近的日期时间值

是否有任何方法可以显示列表中的元素(或可能执行类似功能的任何其他元素)与当前时间进行比较。 所以,我制作了一个包含时间的arraylist,它没有任何重复模式,使用方法将时间增加10分钟(例如)是不可能的

我有以下建议:

具有当前时间的日期函数:

Date date = new Date(); 
DateFormat dateformat = new SimpleDateFormat("HH:mm:ss");

我需要的时间就是ArrayList:

ArrayList<String> time = new ArrayList<String>();

        time.add("5:40");
        time.add("6:40");
        time.add("8:30");
        time.add("9:45");
        time.add("10:35");
        time.add("11:10");
        time.add("11:55");
        time.add("12:20");
        time.add("13:30");
        time.add("14:55");
        time.add("16:00");
        time.add("16:30");
        time.add("17:30");
        time.add("19:00");
        time.add("20:10");
        time.add("21:10");

现在我很好奇,也因为我是新手,有没有下一步的方法:

1)考虑到会有很多数组有时间,有没有一种方法(可能有一些代码示例)可以编写一个方法,该方法将有一个参数,以便用户可以选择要显示的“时间”

2)是否需要使用循环一次(在本例中为“时间”数组),它到达末尾,或者可以写入循环,以便根据当前时间自动转到开始

3)代码优化:这可以用更实用的方式编写吗

我对这方面相当陌生,所以非常感谢任何帮助(包括指导和代码示例),以便我可以在本项目中使用它,并将其作为未来项目的学习材料


共 (4) 个答案

  1. # 1 楼答案

    最好使用实际的日期对象,并对它们进行比较。但是,如果需要使用字符串进行比较,则可以编写一个比较函数,该函数将两个日期进行比较,并在几分钟内输出它们之间的差值

    int compare(String d1, String d2) {
     //split the strings based on the ":"
     string d1Split[] = d1.split(":");
     string d2Split[] = d2.split(":");
    
     //convert each one to minutes - note this assumes the string will always be formatted like "hours:minutes:anything else is irrelevant"
     d1Mins = d1Split[0] * 60 + d1Split[1];
     d2Mins = d2Split[0] * 60 + d2Split[1];
    
     //return the absolute value of the difference between the times in minutes - note this assumes the times will be part of the same day
     return Math.abs(d1Mins - d2Mins);
    }
    

    一旦有了比较函数,您所需要做的就是遍历数组,将每个元素与当前日期进行比较,并存储最近的一个

    int leastDifference = 999999;
    String now = dateformat.format(date);
    String closest = "";
    for (String toCompare : time) {
     int comparison = compare(toCompare, now);
     if (comparison < leastDifference) {
      leastDifference = comparison;
      closest = toCompare;
     }
    }
    

    最近的将包含您正在查找的字符串

  2. # 2 楼答案

    像@BasilBourque一样,我建议将时间存储为LocalTimes,但我也建议使用^{}例如^{}而不是List(我假设列表中的时间都是唯一的)

    想法是TreeSeta ^{} method that does exactly what you need

    Returns the least element in this set greater than or equal to the given element, or null if there is no such element.

    然后你可以写:

    TreeSet<LocalTime> times = new TreeSet<> ();
    times.add(LocalTime.parse("05:40"));
    times.add(LocalTime.parse("06:40"));
    times.add(LocalTime.parse("08:30"));
    //...
    
    LocalTime ceiling = times.ceiling(LocalTime.now());
    if (ceiling != null) //do something with it
    
  3. # 3 楼答案

    爪哇。时间

    使用^{}类而不是String来表示您的值。LocalTime对象表示一天中没有日期和时区的时间

    创建你的^{}

    List<LocalTime> list = new ArrayList<>();
    

    解析

    通过解析输入字符串来填充List。如果您的输入字符串符合ISO 8601标准,包括一位数小时的填充零,那么您不需要定义任何格式模式,因为LocalTime可以直接解析这些值

    list.add( LocalTime.parse( "09:45" ) );
    list.add( LocalTime.parse( "10:35" ) );
    list.add( LocalTime.parse( "11:10" ) );
    

    如果输入字符串缺少填充零,则定义并使用^{}

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "h:m" );
    …
    LocalTime localTime = LocalTime.parse( input , formatter );
    

    分类

    List进行排序。{a5}静态方法是一种方法

    Collections.sort( list );
    

    当前时间

    获取当前时间。为此,需要一个时区(^{}),因为世界各地的挂钟时间因时区而异。使用proper time zone name,不要使用常见的3-4个字母的缩写,如ESTIST

    ZoneId zoneId = ZoneId.of( "America/Montreal" );
    LocalTime now = LocalTime.now( zoneId );
    

    循环列表

    循环List将列表中的每个元素与now进行比较,使用定义“最近”的任何规则。{a8}类跟踪的时间跨度为总秒数加上以纳秒为单位的分数秒

    注意Duration类有各种方法来帮助比较。{a9}方法给出了一个{a10}(将负数转换为正数)。^{}方法告诉您一个持续时间是否大于、小于或等于另一个持续时间

    …
    for ( LocalTime localTime : list ) {
        Duration duration = Duration.between( now , localTime );
        …
    }
    

    NavigableSet

    如果您不介意丢失任何可能的重复时间值,请使用NavigableSet及其^{}方法,如the correct answer by Assyrians所示

  4. # 4 楼答案

    1. 获取当前时间的HH:MM部分
    2. time列表进行排序
    3. 使用二进制搜索:

    String search(String currHrs, List time, int start, int end) { if (start == end && time.get(start) > currHrs) return time.get(start); else return currHrs; int mid = (start + end) >> 1; // discard one half at a time. return (time.get(mid) > currHrs) ? search(currHrs, time, start, mid): search(currHrs, time, mid + 1, end); }