【问题标题】:Android default method to get date and times properly for 1 day and 1 hourAndroid默认方法可以正确获取1天1小时的日期和时间
【发布时间】:2020-12-16 07:42:11
【问题描述】:

我已经编写了 if-else 条件来显示日期和时间,例如 1 天、1 小时等。我想知道是否有任何函数可以在不添加这些条件的情况下执行此操作。我在这里发布我的代码

if(days.toInt() == 0 && hours.toInt() > 1)
            {
                result = "$hours hours"
            }
            else if(hours.toInt() == 0 && days.toInt() > 1)
            {
                result = "$days days"
            }
            else if(days.toInt() == 1 && hours.toInt() > 1)
            {
                result = "$days day $hours hours"
            }
            else if(hours.toInt() == 1 && days.toInt() > 1)
            {
                result = "$days days $hours hour"
            }
            else if(days.toInt() == 1 && hours.toInt() == 0)
            {
                result = "$days day"
            }
            else if(days.toInt() == 0 && hours.toInt() == 1)
            {
                result = "$hours hour"
            }
            else if(days.toInt() == 1 && hours.toInt() == 1)
            {
                result = "$days day $hours hour"
            }
            else if(hours.toInt() == 0 && days.toInt() ==0)
            {
                result = ""
            }
            else if(hours.toInt() > 1 && days.toInt() > 1)
            {
                result = "$days days $hours hours"
            }
            return result

【问题讨论】:

    标签: android kotlin calendar simpledateformat dateformatter


    【解决方案1】:

    我不知道是否有这样的函数,但你可以让你的 if - else 级联更简单,例如通过定义这个函数

    private String my_formatter(int val, String strPlaceholder) {
        String ret = "";
        if ( val == 1 )
                result = "1 " + strPlaceholder;
            else
                result = val + " " + strPlaceholder + "s";
        return ret;
    }
    

    然后你就可以这样做了

    result = "";
    if(days.toInt() > 0) {
        result = result + my_formatter(days.toInt(), "day");
    }
    if(hours.toInt() > 0) {
        result = result + my_formatter(hours.toInt(), "hour");
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用来自android.icu.text.MessageFormat 的ICU MessageFormat(不是来自java.text 的那个)。格式字符串的语法描述在http://userguide.icu-project.org/formatparse/messages

      MessageFormat.format(
              "{days,plural,=1{# day} other {# days}}{hours,plural,=0{} =1{ # hour} other { # hours}}", mapOf<String, Any?>(
                  "days" to 2,
                  "hours" to 0
              ))
      

      您可能还想查看RelativeDateTimeFormatter,但它给出的英文字符串与您的示例略有不同。

       RelativeDateTimeFormatter fmt = RelativeDateTimeFormatter.getInstance();
       fmt.format(1, Direction.NEXT, RelativeUnit.DAYS); // "in 1 day"
      

      【讨论】:

      • 在哪里给出RelativeDateTimeFormatter中的开始和结束日期..或者如何使用该格式? @莫里斯
      • 第一个参数是相对持续时间。这就像您在问题中提到的 dayshours 变量。如果给你开始和结束日期,你需要计算一下
      【解决方案3】:

      java.time

      我建议您使用现代日期时间 API:

      import java.time.Duration;
      import java.time.LocalDateTime;
      
      public class Main {
          public static void main(String[] args) {
              // Test
              System.out.println(getDateTimeDifference("2020-12-20T20:20:50", "2020-12-23T17:10:40"));
      
          }
      
          static String getDateTimeDifference(String strStartDateTime, String strEndDateTime) {
              LocalDateTime startDateTime = LocalDateTime.parse(strStartDateTime);
              LocalDateTime endDateTime = LocalDateTime.parse(strEndDateTime);
              Duration duration = Duration.between(startDateTime, endDateTime);
      
              // #################### Since Java-8 ####################
              String formattedDurationJava8 = String.format("%d days %d hours %d minutes %d seconds", duration.toDays(),
                      duration.toHours() % 24, duration.toMinutes() % 60, duration.toSeconds() % 60);
              System.out.println(formattedDurationJava8);
              // ######################################################
      
              // #################### Since Java-9 ####################
              String formattedDurationJava9 = String.format("%d days %d hours %d minutes %d seconds", duration.toDaysPart(),
                      duration.toHoursPart(), duration.toMinutesPart(), duration.toSecondsPart());
              System.out.println(formattedDurationJava9);
              // ######################################################
      
              // return formattedDurationJava8;
              return formattedDurationJava9;
          }
      }
      

      输出:

      2 days 20 hours 49 minutes 50 seconds
      2 days 20 hours 49 minutes 50 seconds
      2 days 20 hours 49 minutes 50 seconds
      

      一些重要说明:

      1. java.time.DurationISO-8601 standards 为模型,并作为JSR-310 implementation 的一部分与Java-8 一起引入。 Java-9 引入了一些更方便的方法。
      2. java.util 的日期时间 API 及其格式 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到modern date-time API。出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7。如果您正在为Android 项目且您的 Android API 级别仍不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project
      3. 通过 Trail: Date Time 了解现代日期时间 API。

      【讨论】:

        猜你喜欢
        • 2021-11-04
        • 2013-07-31
        • 1970-01-01
        • 2016-04-16
        • 1970-01-01
        • 2019-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多