日历获取时间问题

时间:2017-12-31 21:23:16

标签: android date time calendar simpledateformat

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

目前,在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我收到04/01/2018

我已经在多个虚拟设备和真实手机上测试了我的应用程序,所有这些都使用相同的时区,只有在使用上面的API 24时才发生这个奇怪的问题。

由于

3 个答案:

答案 0 :(得分:2)

我想提供代码的现代版本。 Barns’ answer是正确的,应确保您的代码按预期运行。但我更喜欢:

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

这会产生一个reversedDate 03012018来表示2018年1月3日。如果你需要以某种方式逆转日期,月份和年份的顺序,只需修改格式模式字符串中的顺序,例如uuuuMMddMMdduuuu

我推荐现代课程。即使在不太全新的Android设备上,CalendarSimpleDateFormat也是你内置的,这些类已经过时了,后者尤其出了名的麻烦。因此,在我的代码片段中,我假设您已将ThreeTenABP添加到Android项目中,以允许您使用JSR 310,也称为java.time,即现代Java日期和时间API。这是非常好的工作。导入org.threeten.bp.LocalDateTimeorg.threeten.bp.Monthorg.threeten.bp.format.DateTimeFormatter。此外,StringTokenizer是遗留类。它的文档说“建议任何寻求此功能的人都使用split的{​​{1}}方法或java.util.regex包。”

您的代码出了什么问题?

您没有给我们一个完整且可重现的示例,因此我无法确定,但我强烈怀疑您在下午运行代码时发现错误的日期,即中午12点或更晚的{ {1}}的时区(通常是JVM的时区,反过来通常是您当地的时区)。很可能String是使用当前时间(myCalendarmyCalendar创建的,例如,执行此操作)。在下午,它显然是在下午的时间创建的。然后当你拨打Calendar.getInstance()时,这会尝试在PM内设置小时,但是由于小时是18,这会溢出到第二天的AM,第二天早上6点。

链接

答案 1 :(得分:1)

设置时间并使用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 Docs:

  

<强> HOUR_OF_DAY

     

public static final int HOUR_OF_DAY   获取和设置的字段编号,表示一天中的小时。   HOUR_OF_DAY用于24小时制。例如,在下午10:04:15.250   HOUR_OF_DAY是22。

     

<强> HOUR

     

public static final int HOUR   获取和设置的字段编号,表示上午或小时   下午。小时用于12小时制(0 - 11)。中午和   午夜由0表示,而不是由12表示。例如,在10:04:15.250 PM   小时是10。

答案 2 :(得分:0)

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

例如:

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

这对我的程序完全正常,并给出了我想要的结果以及以所需格式操纵日期。