日历得到时间问题
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);
这产生了一个reversedDate
的03012018
来表示2018年1月3日。如果你需要以某种方式逆转日期,月份和年份的顺序,只需修改格式模式字符串中的顺序,例如uuuuMMdd
或MMdduuuu
。
我推荐现代课程。即使在不太全新的android设备上,Calendar
和SimpleDateFormat
也是你内置的,这些课程已经过时了,后者尤其出了名的麻烦。因此,在我的代码片段中,我假设您已将ThreeTenABP添加到Android项目中,以允许您使用JSR 310,也称为java.time
,即现代Java日期和时间API。这是非常好的工作。导入org.threeten.bp.LocalDateTime
,org.threeten.bp.Month
和org.threeten.bp.format.DateTimeFormatter
。 StringTokenizer
也是遗产类。它的文档说“建议任何寻求此功能的人都使用split
的String
方法或java.util.regex包。”
您的代码出了什么问题?
你没有给我们一个完整的,可重复的例子,所以我不能确定,但我强烈怀疑你看到代码在下午运行时的错误日期,即在myCalendar
的时区中午12点或之后(通常是JVM的时区,反过来通常是您的本地时区)。很可能myCalendar
是用当前时间创建的(例如,Calendar.getInstance()
和new GregorianCalendar()
,这样做)。在下午,它显然是在下午的时间创建的。然后当你调用myCalendar.set(Calendar.HOUR, 18)
时,这会尝试在PM内设置小时,但是由于小时是18,所以这会溢出到第二天的AM,第二天早上6点。
链接
- Oracle tutorial: Date Time,解释如何使用技术,JSR-310 /
java.time
。 - ThreeTen Backport project
- ThreeTenABP,Android版ThreeTen Backport
- Question: How to use ThreeTenABP in Android Project,有一个非常彻底的解释。
- Java Specification Request (JSR) 310,首次描述现代日期和时间API。
我认为你应该使用日历类的getInstance()方法,因为Calendar.getInstance()方法使用指定的时区和指定的语言环境获取日历。
例如:
DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date dat = Calendar.getInstance().getTime();
String s3 = df.format(dat);
这对我的程序完全正常,并给出了我想要的结果以及所需格式的日期操作。
以上是关于日历得到时间问题的主要内容,如果未能解决你的问题,请参考以下文章