Android默认方法可以正确获取1天1小时的日期和时间

Posted

技术标签:

【中文标题】Android默认方法可以正确获取1天1小时的日期和时间【英文标题】:Android default method to get date and times properly for 1 day and 1 hour 【发布时间】: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

【问题讨论】:

【参考方案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 # dayshours,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

一些重要说明:

    java.time.Duration 以ISO-8601 standards 为模型,并作为JSR-310 implementation 的一部分与Java-8 一起引入。 Java-9 引入了一些更方便的方法。 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 desugaring 和 How to use ThreeTenABP in Android Project。 通过 Trail: Date Time 了解现代日期时间 API。

【讨论】:

以上是关于Android默认方法可以正确获取1天1小时的日期和时间的主要内容,如果未能解决你的问题,请参考以下文章

JAVA实现Date日期加一天

如何在 Oracle 的日期中添加一天的最后一小时?

常用的默认函数

默认函数及运用

俩个日期相减获取 02:02:10 格式 天 小时 分钟

如何获得两个日期的时差,例如 x 天 y 小时 z 秒 t 分钟 [重复]