[英]How can I add one month to change into the milliseconds?
我在将当前时间更改为毫秒时遇到问题,毫秒显示在设置日期和时间前一个月。 我知道电脑是从0开始的,请问怎么解决? 首先,我将日期和时间转换为String
,然后将String
转换为SimpleDateFormat
日期,然后将日期转换为Long
。
例如:当用户输入日期 "2018/2/14 11:18 "(AM) 时,日期转换为 long 是 "1515899940000" 。
这是我的代码:
private void setDateField() {
Calendar c = Calendar.getInstance();
int yy = c.get(Calendar.YEAR);
int mm = c.get(Calendar.MONTH);
int dd = c.get(Calendar.DAY_OF_MONTH);
c.set(Calendar.MONTH, mm);
c.set(Calendar.DAY_OF_MONTH, dd);
c.set(Calendar.YEAR, yy);
DatePickerDialog datePickerDialog = new DatePickerDialog(this,android.R.style.Theme_Holo_Light_Dialog ,new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int selectedYear, int selectedMonth, int selectedDate) {
year = selectedYear;
month = selectedMonth;
day = selectedDate;
date_time = year + "/" + (month + 1) + "/" + day;
timePicker();
}
},year, month, day);
datePickerDialog.getDatePicker().setMinDate(c.getTimeInMillis());
datePickerDialog.show();
}
private void timePicker(){
// Get Current Time
final Calendar c = Calendar.getInstance();
hours = c.get(Calendar.HOUR_OF_DAY);
minutes = c.get(Calendar.MINUTE);
// Launch Time Picker Dialog
TimePickerDialog timePickerDialog = new TimePickerDialog(this,android.R.style.Theme_Holo_Light_Dialog,new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay,int minute) {
hours = hourOfDay;
minutes = minute;
string_date = date_time+" "+format(hours) + ":" +format(minutes) ;
addtime.setText(string_date);
Log.e("JEJEJEJE",string_date);
SimpleDateFormat f = new SimpleDateFormat("yyyy/mm/dd HH:mm");
try {
Date d = f.parse(string_date);
milliseconds = d.getTime();
Log.e("LONGGGGGGG", String.valueOf(milliseconds));
} catch (ParseException e) {
e.printStackTrace();
}
}
}, hours, minutes, true);
timePickerDialog.show();
}
我建议:首先,而不是你的变量(字段?) year
, month
, day
, hours
和minutes
只是声明
private LocalDate date;
private LocalTime time;
private long milliseconds;
(保持milliseconds
变量,因为您希望在此处获得结果。)
在onDateSet
,以这种方式为date
赋值:
date = LocalDate.of(selectedYear, selectedMonth + 1, selectedDate);
这就是我们要考虑的地方,正如您所说,日期选择器的selectedMonth
是从 0 开始的,而LocalDate
以人类的方式从 1 开始编号月份。
现在你的timePicker
方法变成了
private void timePicker(){
// Get Current Time
time = LocalTime.now(ZoneId.systemDefault());
// Launch Time Picker Dialog
TimePickerDialog timePickerDialog = new TimePickerDialog(this,
android.R.style.Theme_Holo_Light_Dialog,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay,int minute) {
time = LocalTime.of(hourOfDay, minute);
milliseconds = date.atTime(time)
.atZone(ZoneId.systemDefault())
.toInstant()
.toEpochMilli();
Log.e("LONGGGGGGG", String.valueOf(milliseconds));
}
},
time.getHour(),
time.getMinute(),
true);
timePickerDialog.show();
}
你把事情过于复杂了。 我建议:
SimpleDateFormat
这样的格式化程序(我可能会补充说,这是出了名的麻烦,所以没有它也很好)。java.time
,现代 Java 日期和时间 API。 与Calendar
等老式日期和时间类相比,它的使用要好得多。 这两点在上面的片段中是相辅相成的。 此外,据我所知,您对setDateField
的Calendar
对象( c
)没有用处,只需将其删除并全部使用即可。
罪魁祸首是您的SimpleDateFormat
。 尝试像这样使用它:
SimpleDateFormat f = new SimpleDateFormat("yyyy/mm/dd HH:mm");
System.out.println(f.parse("2018/04/17 12:45"));
在我的电脑上打印
Wed Jan 17 12:45:00 CET 2018
无论字符串中是什么,它都会打印一月的日期。 这是因为您尝试了小写mm
月份。 mm
是分钟(您也正确使用了),月份是大写MM
。 因此,您的格式化程序根本无法解析月份并将您的日期指定为默认月份,即一年中的第一个月,即一月。 一月份的这个日期当然也是你的毫秒值。
java.time
吗? 是的,您可以在 Android 上使用java.time
。 使用它只需要 Java 6 。
org.threeten.bp
和子包中导入日期和时间类。java.time
。 Calendar
对象为我们提供了getTimeInMillis()
和add(int field, int amount)
。 添加看起来像add(Calendar.MONTH, 1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.