https://gist.github.com/anonymous/e14bbbb89dd8636f1237c73dc8878b3f
我在这段代码中遇到一个错误导致最后一个switch语句(第298 - 307行)返回当前日期的默认值,而第二天的情况是0,当我的模拟器时区设置为另一侧时GMT + 0线的数据来自于数据集。 (即亚洲的系统时间,如北京,以及东部时区的数据集,如亚特兰大)
如何更新它以考虑其他时区的系统检查从GMT + 0线另一侧的区域提供的数据?
答案 0 :(得分:2)
如果您相信您的JVM的时区设置反映了用户的时区,则可以使用以下现代正确方式获取从该日期到该时区所提供日期的天数:
private static String getDayName(Context context, long dateInMillis) {
ZoneId zone = ZoneId.systemDefault();
LocalDate providedDate = Instant.ofEpochMilli(dateInMillis)
.atZone(zone)
.toLocalDate();
LocalDate today = LocalDate.now(zone);
int daysAfterToday = (int) ChronoUnit.DAYS.between(today, providedDate);
switch (daysAfterToday) {
case 0:
return context.getString(R.string.today);
case 1:
return context.getString(R.string.tomorrow );
default:
return providedDate.getDayOfWeek()
.getDisplayName(TextStyle.FULL,
Locale.getDefault(Locale.Category.FORMAT));
}
}
我说“如果您相信您的JVM的时区设置反映了用户的时区”,因为时区设置可能会被程序的其他部分或在同一JVM中运行的其他程序更改。如果您更了解用户的时区,您当然应该使用您的知识,例如:
ZoneId zone = ZoneId.of("America/Cordoba");
我希望插入daysAfterToday
是0到6区间的支票。在从long
转换为int
之前。
我正在使用并热烈推荐java.time,即现代Java日期和时间API。与过时的TimeZone
课程以及您正在使用的臭名昭着的SimpleDateFormat
相比,它的工作效果要好得多。
java.time
用于我的API级别吗?是的,java.time
适用于较旧和较新的Android设备。
org.threeten.bp
和子包中导入日期和时间类。java.time
。