我有一个小应用程序,只需设置日历的时间和日期,然后检索它。
目前,在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时才发生这个奇怪的问题。
由于
答案 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日。如果你需要以某种方式逆转日期,月份和年份的顺序,只需修改格式模式字符串中的顺序,例如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
的{{1}}方法或java.util.regex包。”
您没有给我们一个完整且可重现的示例,因此我无法确定,但我强烈怀疑您在下午运行代码时发现错误的日期,即中午12点或更晚的{ {1}}的时区(通常是JVM的时区,反过来通常是您当地的时区)。很可能String
是使用当前时间(myCalendar
和myCalendar
创建的,例如,执行此操作)。在下午,它显然是在下午的时间创建的。然后当你拨打Calendar.getInstance()
时,这会尝试在PM内设置小时,但是由于小时是18,这会溢出到第二天的AM,第二天早上6点。
new GregorianCalendar()
。答案 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);
这对我的程序完全正常,并给出了我想要的结果以及以所需格式操纵日期。