在 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类型变量中提取日期和时间