繁体   English   中英

如何将一个月添加到毫秒?

[英]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 , hoursminutes只是声明

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();

}

你把事情过于复杂了。 我建议:

  1. 不要在业务逻辑中使用日期或时间字符串,而应使用日期和时间对象。 这也意味着您不需要像SimpleDateFormat这样的格式化程序(我可能会补充说,这是出了名的麻烦,所以没有它也很好)。
  2. 使用java.time ,现代 Java 日期和时间 API。 Calendar等老式日期和时间类相比,它的使用要好得多。

这两点在上面的片段中是相辅相成的。 此外,据我所知,您对setDateFieldCalendar对象( 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 因此,您的格式化程序根本无法解析月份并将您的日期指定为默认月份,即一年中的第一个月,即一月。 一月份的这个日期当然也是你的毫秒值。

问题:我可以在 Android 上使用java.time吗?

是的,您可以在 Android 上使用java.time 使用它只需要 Java 6

  • 在 Java 8 及更高版本和更新的 Android 版本中,新的 API 是内置的。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,现代类的后向移植(ThreeTen for JSR 310,现代 API 在此处首次被描述)。
  • 在较旧的 Android 上,使用 ThreeTen Backport 的 Android 版本。 它被称为 ThreeTenABP。 确保从包org.threeten.bp和子包中导入日期和时间类。

链接

日历对象的文档

Calendar对象为我们提供了getTimeInMillis()add(int field, int amount) 添加看起来像add(Calendar.MONTH, 1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM