java - 如何从日历对话框中获取相关的星期几而不是先前选择的日期

标签 java arraylist calendar

我在寻找什么: 当选择任意日期时,输出相关的日期字符串,即“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)定义为全局变量(在o​​ncreate期间)。

我只是想知道如何解决这个问题。

最佳答案

从零开始计数

糟糕的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() ;

Table of date-time types in Java, both modern and legacy

<小时/>

关于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类?

Table of which java.time library to use with which version of Java or Android

关于java - 如何从日历对话框中获取相关的星期几而不是先前选择的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58927590/

相关文章:

java - 为什么ArrayList中的set方法不更新modCount?

javascript - Microsoft Graph API - v1.0/me/events 禁止 403

javascript - jquery 数据表插件和动态对象名称

java - Vaadin 小部件集编译失败

java - JPA AttributeConverter 被忽略

java - 如何通过 tomcat 上的多个请求共享 AmazonSQS 连接?

database - 使用 NLS_CALENDAR 参数设置数据库为 'Thai Buddha'

java - 用循环返回两个整数?

java - 将 ArrayList<Object> 作为参数传递给方法,处理 arrayList 并返回它 - Java

java - 如何显示 ArrayList 中包含重复值的所有项目?