日历获取时间问题

Calendar get time issue

我有一个小应用程序,它只是设置日历的时间和日期,然后检索它。

目前,在 API24 之前的设备上使用我的应用程序时,它会检索到最初设置的正确日期。但是,如果您 运行 在高于 API 24 的设备上应用程序,则返回的日期比所需结果晚一天。

我的代码如下

正在设置日历的日期....

myCalendar.set(Calendar.YEAR, 2018 );
myCalendar.set(Calendar.DAY_OF_MONTH, 3);
myCalendar.set(Calendar.MONTH, 0);
myCalendar.set(Calendar.HOUR, 18);
myCalendar.set(Calendar.MINUTE, 30);

检索日期

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
String dates = sdf.format(myCalendar.getTime());


StringTokenizer revDate = new StringTokenizer(dates, "/");
String txtDays = revDate.nextToken();
String txtMonths = revDate.nextToken();
String txtYears = revDate.nextToken();

String reversedDate = txtDays + txtMonths + txtYears;

在 API 24 以下的手机上,我们在 API 24 以上收到正确的日期 03/01/2018

我已经在多个虚拟设备和真实手机上测试了我的应用程序,它们都使用相同的时区,只有在使用 API 24 以上时才会出现这个奇怪的问题。

谢谢

当您设置时间并且您使用的是 24 小时制时,您应该使用“HOUR_OF_DAY”而不是“HOUR”。

试试这个:

myCalendar.set(Calendar.YEAR, 2018 );
myCalendar.set(Calendar.DAY_OF_MONTH, 3);
myCalendar.set(Calendar.MONTH, 0);
myCalendar.set(Calendar.HOUR_OF_DAY, 18);
myCalendar.set(Calendar.MINUTE, 30);

根据 JAVA 文档:

HOUR_OF_DAY

public static final int HOUR_OF_DAY Field number for get and set indicating the hour of the day. HOUR_OF_DAY is used for the 24-hour clock. E.g., at 10:04:15.250 PM the HOUR_OF_DAY is 22.

HOUR

public static final int HOUR Field number for get and set indicating the hour of the morning or afternoon. HOUR is used for the 12-hour clock (0 - 11). Noon and midnight are represented by 0, not by 12. E.g., at 10:04:15.250 PM the HOUR is 10.

我想贡献你的代码的现代版本。 是正确的,应该确保您的代码按预期运行。但我更喜欢:

    LocalDateTime myDateTime = LocalDateTime.of(2018, Month.JANUARY, 3, 18, 30);
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("ddMMuuuu");
    String reversedDate = myDateTime.format(dtf);

这会产生 reversedDate of 03012018 来表示 2018 年 1 月 3 日。如果您需要以某种方式颠倒月、月、年的顺序,只需修改格式中的顺序即可模式字符串,例如 uuuuMMddMMdduuuu.

我推荐现代 classes。即使在不太新的 Android 设备上,CalendarSimpleDateFormat 是您内置的,那些 classes 早就过时了,后者在特别是出了名的麻烦。因此,在我的代码片段中,我假设您已将 ThreeTenABP 添加到您的 Android 项目中,以允许您使用 JSR 310,也称为 java.time,现代 Java 日期和时间 API.这非常好用。导入 org.threeten.bp.LocalDateTimeorg.threeten.bp.Monthorg.threeten.bp.format.DateTimeFormatterStringTokenizer 也是一项遗产 class。它的文档说“建议任何寻求此功能的人使用 Stringsplit 方法或 java.util.regex 包。”

你的代码出了什么问题?

你没有给我们一个完整的、可重现的例子,所以我不能确定,但​​我强烈怀疑你看到的日期不正确,因为你的代码是 运行 下午,也就是 12 点myCalendar 时区的中午或更晚时间(通常是 JVM 的时区,通常是您当地的时区)。 myCalendar 很可能是用当前时间创建的(例如 Calendar.getInstance()new GregorianCalendar(),执行此操作)。在下午,它显然是在 PM 中创建的。然后,当您调用 myCalendar.set(Calendar.HOUR, 18) 时,它会尝试将小时设置在 PM 内,但由于小时是 18,因此会溢出到第二天的上午,成为第二天的早上 6 点。

链接

我认为您应该使用日历 class 的 getInstance() 方法,因为 Calendar.getInstance() 方法使用指定的时区和指定的语言环境获取日历。

例如:

    DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
    Date dat = Calendar.getInstance().getTime();
    String s3 = df.format(dat);

这对我的程序来说工作得很好,并以我想要的格式给出了我想要的结果以及对日期的操作。