在 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);
}
}
了解有关现代日期时间的更多信息 API
* 如果您正在为 Android 项目工作,并且您的 Android API 水平仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring. Note that Android 8.0 Oreo already provides support for java.time
。
我是 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);
}
}
了解有关现代日期时间的更多信息 API
* 如果您正在为 Android 项目工作,并且您的 Android API 水平仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring. Note that Android 8.0 Oreo already provides support for java.time
。