简单日期格式错误解析日期

Simple Date Format error parsing date

我对简单日期格式有疑问,我不知道为什么。 这是我的算法

if (realtimeDeparture != null) {
        int hours = this.realtimeDeparture / 3600;
        int minutes = (this.realtimeDeparture % 3600) / 60;
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
        try {
            Calendar cal = Calendar.getInstance(Locale.FRENCH);
            String date = cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH)+1)+ "-" + cal.get(Calendar.DAY_OF_MONTH)+ " " + hours+":"+minutes;
            result = df.parse(date);
}

我有一个 API,它在 00h00 之后给出了秒数(realtimeDeparture) 我想从这个整数中提取一个真正的日期对象 所以我做了这个算法,但我不知道为什么会浪费时间。

例如有一些输入和结果值:

date = 2018-5-7 12:26
result = Mon May 07 00:26:00 GMT+02:00 2018

我试图检查 07/05/2018 是否与 7/5/2018 不同,但问题相同:

date = 2018-05-07 12:26 
result = Mon May 07 00:26:00 GMT+02:00 2018

如何从 00h00 开始的几秒内获取我的日期对象? 或者我该如何修正我的算法?

试试这个代码..

   String date=" 2018-5-7 12:26";
    SimpleDateFormat spf=new SimpleDateFormat("yyyy-mm-dd hh:mm");
    Date newDate= null;
    try {
        newDate = spf.parse(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    spf= new SimpleDateFormat("EEE MMM dd hh:mm:ss zzz yyyy", Locale.ENGLISH);
    date = spf.format(newDate);
    System.out.println(date);

然后对象要像下面的代码那样转换..

        try {
        Date dateToshow=spf.parse(date);
        Log.d("Date object:",dateToshow.toString());
    } catch (ParseException e) {
        e.printStackTrace();
    }

我觉得你的计算没问题,所以我猜问题出在格式上。

您尝试过使用

cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);

然后通过

获取日期
Date date = cal.getTime();

使用 java.time,现代 Java 日期和时间 API,这更容易,更直接,错误更少-俯卧:

    int realtimeDeparture = 44783;
    LocalTime time = LocalTime.ofSecondOfDay(realtimeDeparture);
    System.out.println(time);

这会打印:

12:26:23

如果你需要今天的日期在当天的时间,你需要先确定一个时区,例如:

    ZoneId zone = ZoneId.of("Asia/Bangkok");
    ZonedDateTime dateTime = LocalDate.now(zone).atTime(time).atZone(zone);
    System.out.println(dateTime);

2018-05-07T12:26:23+07:00[Asia/Bangkok]

问题:为什么需要时区?因为地球上任何地方的日期都不同。您可以指定 ZoneId.systemDefault() 以使用 JVM 的时区设置,而该设置通常来自设备。但是,它可以随时从程序的另一部分或同一 JVM 中的另一个程序 运行 更改。

你的代码出了什么问题?

在您的格式模式字符串中,您使用小写字母 hh 表示小时数,在您的示例中为 12。 hh 表示 AM 或 PM 中的小时,从 01 到 12。当您不指定 AM 或 PM 时,SimpleDateFormat 使用 AM 作为默认值。 12:26 AM 表示午夜过后 26 分钟,与 24 小时制的 00:26 相同。所以这就是 SimpleDateFormat 给你的。

你很幸运能够在一天中的 12 小时进行测试。尽管有你的错误,但其他时间的工作与你预期的一样。其他人也犯了同样的错误,而且很长一段时间都没有引起注意。相比之下,现代 API 会在类似情况下抛出异常,让您知道缺少 AM/PM 标记。我显然更喜欢这种行为。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更高版本以及较新的 Android 设备上(据我所知,来自 API 级别 26)现代 API 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,新 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接