Java 如何从“日历”对话框中获取相关的一周中的某一天,而不是以前选择的某一天
我在找什么: 选择任何日期后,输出日期的相关字符串,即“Mon,Tue,…,Sun” 我所做的: 我有一个编辑文本视图,用于选择日期,日期格式为MM/dd/YY。 这很有效 出了什么问题: 最初,当我选择一个日期(不是当前日期)字符串时,输出的是“当前日期”,而不是我现在选择的日期。当我选择另一个日期时,字符串显示以前(在本例中是最初选择的)选择的日期。简单地说,这就像存储前一天的字符串 我的代码:Java 如何从“日历”对话框中获取相关的一周中的某一天,而不是以前选择的某一天,java,arraylist,calendar,Java,Arraylist,Calendar,我在找什么: 选择任何日期后,输出日期的相关字符串,即“Mon,Tue,…,Sun” 我所做的: 我有一个编辑文本视图,用于选择日期,日期格式为MM/dd/YY。 这很有效 出了什么问题: 最初,当我选择一个日期(不是当前日期)字符串时,输出的是“当前日期”,而不是我现在选择的日期。当我选择另一个日期时,字符串显示以前(在本例中是最初选择的)选择的日期。简单地说,这就像存储前一天的字符串 我的代码: Datelistner = CustomDateTimePicker.getCustomDate
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(我相信你需要覆盖日期选择器的
方法。这不是我的主字段,所以有点保留地说。覆盖什么?我的意思是什么是保留非常感谢你的详细解释。当我按照描述开始编辑时,在我的Android studio(3.5)它说在@SachzEMSPE的“ZoneId.of”步骤中需要API 26,您应该用“Android”标记。我将添加一个关于Three Ten Backport和Three TenAbp的部分。onDateSet
java.util.Date myJavaUtilDate = java.util.Date.from( instant ) ;
Instant instant = zdt.toInstant() ;