在 Kotlin 中显示日期而不是变量

Posted

技术标签:

【中文标题】在 Kotlin 中显示日期而不是变量【英文标题】:Day displayed in Kotlin instead of variable 【发布时间】:2021-12-08 10:37:15 【问题描述】:

我是 kotlin 和 android studio 的新手,我正试图在文本视图中显示这一天。我的问题是根据当天只显示数字 1 到 7,而不是当天的名称我必须更改什么来解决这个问题?

val day = Calendar.getInstance().get(Calendar.DAY_OF_WEEK)

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)




    fun dayOfWeek() 
        val day = Calendar.getInstance().get(Calendar.DAY_OF_WEEK)
        println(
            when (day) 
                1 -> "Sunday"
                2 -> "Monday"
                3 -> "Tuesday"
                4 -> "Wednesday"
                5 -> "Thursday"
                6 -> "Friday"
                7 -> "Saturday"
                else -> "Time has stopped"
            
        )
    
    tag = findViewById(R.id.Tag)
    tag.text = day.toString()

【问题讨论】:

不要编写自己的方法/函数来查找星期几的名称。 Java 已经知道这些名称。今天使用LocalDate.now(ZoneId.systemDefault()).getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.ENGLISH)。当我现在运行它时,它产生了Tuesday。此外,我正在使用并推荐 java.time, the modern Java date and time API,而不是旧的和设计不佳的 Calendar 类。 【参考方案1】:

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

使用现代日期时间 API java.time 的解决方案:有几种方法可以做到这一点,如下所示:

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;

public class Main 
    public static void main(String[] args) 
        // If you want to deal with the system timezone, you can simply use
        // LocalDate.now() instead of LocalDate.now(ZoneId.systemDefault()). In order to
        // deal with a specific timezone, replace ZoneId.systemDefault() with the
        // applicable ZoneId e.g. ZoneId.of("Asia/Kabul")
        LocalDate date = LocalDate.now(ZoneId.systemDefault());

        String dow = date.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.ENGLISH);
        System.out.println(dow);

        // Alternatively,
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEEE", Locale.ENGLISH);
        dow = dtf.format(date);
        System.out.println(dow);
    

ONLINE DEMO

Trail: Date Time 了解有关现代日期时间 API 的更多信息。


* 如果您正在为一个 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring。请注意,Android 8.0 Oreo 已经提供了support for java.time

【讨论】:

我认为它本身并不能解决所问的问题,但这是非常好的建议。 谢谢,@OleV.V。为反馈。我相信,这就是OP所需要的。当然,OP 必须写 tag.setText(date.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.ENGLISH))tag.setText(dtf.format(date))【参考方案2】:

在您的代码中,day 是一个 Int 属性。

您创建了一个名为 dayOfWeek() 的函数,您永远不会调用它,因此代码永远不会运行。

当您执行tag.text = day.toString() 时,它查看的是day 属性,而不是函数内的day 变量。将变量命名为与同一类中的某些属性相同的名称通常是一个坏主意,因为这会使代码难以阅读。但在这种情况下,这两种方式都无关紧要,因为它们都是 Ints。

在您的dayOfWeek() 函数中,您使用when 表达式将day 转换为字符串,但您只是在打印它。您不会将其存储在变量中,以便它可以用于其他任何事情,例如将其设置在 TextView 上。

您可以让您的函数返回一个字符串,并以这种方式使用它。我还将您的函数移到 onCreate() 函数之外。为此类任务在另一个函数中创建一个函数是不常见的。

val day = Calendar.getInstance().get(Calendar.DAY_OF_WEEK)

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    tag = findViewById(R.id.Tag)
    tag.text = getDayOfWeekText()


fun getDayOfWeekText() 
    return when (day) 
        1 -> "Sunday"
        2 -> "Monday"
        3 -> "Tuesday"
        4 -> "Wednesday"
        5 -> "Thursday"
        6 -> "Friday"
        7 -> "Saturday"
        else -> "Time has stopped"
    

或者通过适当的语言支持以简单的方式做到这一点:

tag.setText(DateTimeFormatter.ofPattern("EEEE").format(LocalDate.now()))

【讨论】:

非常感谢这个详细的回答,现在我明白我的错了

以上是关于在 Kotlin 中显示日期而不是变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android上的Kotlin中从Long类型变量中提取日期和时间

Kotlin 之 const

使用 Kotlin 进行 JPA 审计

Kotlin 代码堆栈跟踪显示 Java 行号

如何在 RecyclerView android kotlin 中的每个项目上显示日期(日和月)

如何在kotlin中使用$字符串而不是转义符