【问题标题】:How to get the relevant day of week from Calendar dialog instead of previously selected day如何从日历对话框中获取相关的星期几而不是先前选择的日期
【发布时间】:2019-11-19 06:02:40
【问题描述】:

我在寻找什么: 选择任意日期时,输出相应的日期字符串“Mon, Tue,...,Sun”

我做了什么: 我有一个编辑文本视图,用于选择日期,日期格式为 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 期间)。

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

【问题讨论】:

  • 我相信您需要覆盖日期选择器的 onDateSet 方法。这不是我的家乡,所以有些保留地说。
  • 用什么覆盖?我的意思是预订是什么意思

标签: java arraylist calendar


【解决方案1】:

从零开始计数

糟糕的Calendar 类有许多糟糕的设计决策。其中之一是将星期几计算为从零开始。所以第一天是 0,最后一天是 7。看起来你正在减去一个以在你的数组中获得一个从零开始的索引,而没有意识到你已经有一个从零开始的数字。所以停止减法。

周定义不同

另一个问题是Calendar 中一周的定义因地区而异。

java.time

更重要的是,您应该使用现代的 java.time 类,而不是血腥可怕的传统日期时间类。

按区域划分的当前时刻

获取时区中的当前日期时间。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

生成文本

使用 Java 内置的 DayOfWeek 枚举获取星期几。

DayOfWeek dow = zdt.getDayOfWeek() ; 

自动本地化。不需要您列出日期名称的数组。

指定Locale 以确定本地化的人类语言和文化规范。

Locale locale = Locale.CANADA_FRENCH ;  // Or Locale.US or such. 
String output = dow.getDisplayName( TextStyle.SHORT , locale ) ;

转换

要与尚未更新到java.time 的旧代码互操作,请转换。调用添加到旧类的新方法。

ZonedDateTime 类替换 GregorianCalendarCalendar 后面通常的具体类。所以投。

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.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

【讨论】:

  • 非常感谢您的详细解释。当我根据描述开始编辑时,在我的 android studio (3.5) 中,它说“ZoneId.of”步骤中需要 API 26
  • @SachzEMSPE 你应该已经标记了“Android”。我将添加一个关于 ThreeTen-Backport 和 ThreeTenABP 的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多