Java 如何从“日历”对话框中获取相关的一周中的某一天,而不是以前选择的某一天

Java 如何从“日历”对话框中获取相关的一周中的某一天,而不是以前选择的某一天,java,arraylist,calendar,Java,Arraylist,Calendar,我在找什么: 选择任何日期后,输出日期的相关字符串,即“Mon,Tue,…,Sun” 我所做的: 我有一个编辑文本视图,用于选择日期,日期格式为MM/dd/YY。 这很有效 出了什么问题: 最初,当我选择一个日期(不是当前日期)字符串时,输出的是“当前日期”,而不是我现在选择的日期。当我选择另一个日期时,字符串显示以前(在本例中是最初选择的)选择的日期。简单地说,这就像存储前一天的字符串 我的代码: Datelistner = CustomDateTimePicker.getCustomDate

我在找什么: 选择任何日期后,输出日期的相关字符串,即“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()));

}
Datelistner=CustomDateTimePicker.getCustomDatePicker(DateEditText,null,myCalander);
DateEditText.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
DatePickerDialog DatePickerDialog=新建DatePickerDialog(getContext(),Datelistner,
myCalander.get(日历年),
myCalander.get(日历月),
myCalander.get(日历,月日));
selectedDateIndex=myCalander.get(日历、星期日);
ArrayList dateString=新的ArrayList();
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(新日期().getTime());
datePickerDialog.setCancelable(假);
datePickerDialog.show();
}
});
updateLabelAddEvent();
私有void updateLabelAddEvent(){
字符串myFormat=“MM/dd/yy”;
SimpleDataFormat sdf=新的SimpleDataFormat(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 ) ;
生成文本 使用Java内置的枚举获取星期几

DayOfWeek dow = zdt.getDayOfWeek() ; 
自动本地化。不需要你列出日期名称的数组

指定
区域设置
,以确定本地化的人类语言和文化规范

Locale locale = Locale.CANADA_FRENCH ;  // Or Locale.US or such. 
String output = dow.getDisplayName( TextStyle.SHORT , locale ) ;
转换 要与尚未更新为java.time的旧代码进行互操作,请转换。在添加到旧类的方法中调用new to/from

ZoneDateTime
类取代了
GregoriaCalendar
,后者是
Calendar
后面常见的具体类。那就投吧

Calendar c = GregorianCalendar.from( zdt ) ;
以及:

我看到您还使用了
java.util.Date
。替换为
Instant
,表示UTC中的一个时刻

Instant instant = myJavaUtilDate.toInstant() ;
以及:

您可以从您的
ZoneDateTime
中获得
即时

Instant instant = zdt.toInstant() ;


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

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

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(我相信你需要覆盖日期选择器的
      onDateSet
      方法。这不是我的主字段,所以有点保留地说。覆盖什么?我的意思是什么是保留非常感谢你的详细解释。当我按照描述开始编辑时,在我的Android studio(3.5)它说在@SachzEMSPE的“ZoneId.of”步骤中需要API 26,您应该用“Android”标记。我将添加一个关于Three Ten Backport和Three TenAbp的部分。
      java.util.Date myJavaUtilDate = java.util.Date.from( instant ) ;
      
      Instant instant = zdt.toInstant() ;