日历得到时间问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日历得到时间问题相关的知识,希望对你有一定的参考价值。

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

目前,在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时才会出现这个奇怪的问题。

谢谢

答案

设置时间并使用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 get和set的字段编号,表示当天的小时。 HOUR_OF_DAY用于24小时制。例如,在下午10:04:15.250,HOUR_OF_DAY是22。

小时

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

另一答案

我想贡献您的代码的现代版本。 Barns’ answer是正确的,应该确保您的代码行为正常。但是我更喜欢:

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

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

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

您的代码出了什么问题?

你没有给我们一个完整的,可重复的例子,所以我不能确定,但​​我强烈怀疑你看到代码在下午运行时的错误日期,即在myCalendar的时区中午12点或之后(通常是JVM的时区,反过来通常是您的本地时区)。很可能myCalendar是用当前时间创建的(例如,Calendar.getInstance()new GregorianCalendar(),这样做)。在下午,它显然是在下午的时间创建的。然后当你调用myCalendar.set(Calendar.HOUR, 18)时,这会尝试在PM内设置小时,但是由于小时是18,所以这会溢出到第二天的AM,第二天早上6点。

链接

另一答案

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

例如:

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

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

以上是关于日历得到时间问题的主要内容,如果未能解决你的问题,请参考以下文章

Android 中的日历视图

CalDAV 请求 gGt iCloud 日历事件

这个代码片段有啥作用?

Swift 4.0 Eventkit 无法正确获取日历和事件

需要示例代码片段帮助

从日历中获取日期前 18 年