我在寻找什么: 当选择任意日期时,输出相关的日期字符串,即“Mon, Tue,...,Sun”
我做了什么: 我有一个编辑 TextView ,用于选择日期,日期格式为 MM/dd/YY。 这效果很好。
出了什么问题: 最初,当我选择一个日期(不是当前日期)字符串时,输出“当前日期”而不是我现在选择的日期。当我选择另一个日期时,字符串显示之前选择的日期(在本例中为最初选择的日期)。简单来说,就像存储前一天的字符串一样。
我的代码:
Datelistner = CustomDateTimePicker.getCustomDatePicker(DateEditText,null,myCalander);
DateEditText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DatePickerDialog datePickerDialog = new DatePickerDialog(getContext(),Datelistner,
myCalander.get(Calendar.YEAR),
myCalander.get(Calendar.MONTH),
myCalander.get(Calendar.DAY_OF_MONTH));
selectedDateIndex = myCalander.get(Calendar.DAY_OF_WEEK);
ArrayList<String> dateString = new ArrayList<String>();
dateString.add("Sun");
dateString.add("Mon");
dateString.add("Tue");
dateString.add("Wed");
dateString.add("Thu");
dateString.add("Fri");
dateString.add("Sat");
selectedDate = dateString.get(selectedDateIndex - 1);
datePickerDialog.getDatePicker().setMinDate(new Date().getTime());
datePickerDialog.setCancelable(false);
datePickerDialog.show();
}
});
updateLabelAddEvent();
private void updateLabelAddEvent() {
String myFormat = "MM/dd/yy";
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.getDefault());
DateEditText.setText(sdf.format(myCalander.getTime()));
}
我已经将字符串变量(selectedDate)和int变量(selectedDateIndex)定义为全局变量(在oncreate期间)。
我只是想知道如何解决这个问题。
最佳答案
从零开始计数
糟糕的Calendar
类有许多糟糕的设计决策。其中之一是以零为基础计算星期几。所以第一天是 0,最后一天是 7。看起来您正在减去 1 以获得从零开始的索引到数组中,但没有意识到您已经有一个从零开始的数字。所以别再做减法了。
周定义各不相同
另一个问题是日历
中一周的定义因区域设置而异。
java.time
更重要的是,您应该使用现代的 java.time 类,而不是该死的可怕的遗留日期时间类。
按区域显示当前时刻
获取时区中显示的当前日期时间。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
生成文本
使用 DayOfWeek
获取星期几Java 内置枚举。
DayOfWeek dow = zdt.getDayOfWeek() ;
自动本地化。不需要您的列表日期名称数组。
指定区域设置
以确定本地化的人类语言和文化规范。
Locale locale = Locale.CANADA_FRENCH ; // Or Locale.US or such.
String output = dow.getDisplayName( TextStyle.SHORT , locale ) ;
转换
要与尚未更新到 java.time 的旧代码进行互操作,请进行转换。调用添加到旧类的新方法。
ZonedDateTime
类取代了 GregorianCalendar
(Calendar
背后的常见具体类)。所以投。
Calendar c = GregorianCalendar.from( zdt ) ;
还有:
ZonedDateTime zdt = ( ( GregorianCalendar ) c ).toZonedDateTime() ;
我发现您还使用java.util.Date
。替换为 Instant
以表示 UTC 中的某个时刻。
Instant instant = myJavaUtilDate.toInstant() ;
还有:
java.util.Date myJavaUtilDate = java.util.Date.from( instant ) ;
您可以从 ZonedDateTime
获取Instant
。
Instant instant = zdt.toInstant() ;
<小时/>
关于java.time
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date
, Calendar
, & SimpleDateFormat
.
要了解更多信息,请参阅 Oracle Tutorial 。并在 Stack Overflow 上搜索许多示例和解释。规范为JSR 310 .
Joda-Time项目,现在位于 maintenance mode ,建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用JDBC driver符合JDBC 4.2或稍后。不需要字符串,不需要 java.sql.*
类。
从哪里获取java.time类?
- Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11以及后来的版本 - 具有捆绑实现的标准 Java API 的一部分。
- Java 9 添加了一些小功能和修复。
- Java SE 6和 Java SE 7
- 大多数 java.time 功能已向后移植到 ThreeTen-Backport 中的 Java 6 和 7 .
- Android
- Android 的更高版本捆绑了 java.time 类的实现。
- 对于早期的 Android (<26),ThreeTenABP项目适应ThreeTen-Backport (上文提到的)。请参阅How to use ThreeTenABP… .
关于java - 如何从日历对话框中获取相关的星期几而不是先前选择的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58927590/