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

Day displayed in Kotlin instead of variable

我是 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()

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

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

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

在您的 dayOfWeek() 函数中,您正在使用 when 表达式将 day 转换为字符串,但您只是打印它。您没有将它存储在一个变量中,这样它就可以用于其他任何事情,比如将它设置在 TextView 上。

您可以使您的函数 return 成为一个字符串,并以这种方式使用它。我还会将您的函数移到 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()))

java.time

java.util 日期时间 API 及其格式 API、SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*.

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

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. Note that Android 8.0 Oreo already provides support for java.time