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

时间:2018-05-07 10:37:14

标签: java android datetime simpledateformat

我遇到了简单日期格式的问题,我不知道为什么。 这是我的算法

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对象 所以我做了这个算法,但我放松了一小时,我不知道为什么。

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

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之后的几秒钟内获取我的日期对象? 或者我如何修复我的算法?

3 个答案:

答案 0 :(得分:1)

您的计算对我来说很好,所以我的猜测是问题是格式化。

您是否尝试过使用

subprojects {

然后用

获取日期
cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);

答案 1 :(得分:1)

使用现代Java日期和时间API的 java.time ,这样更简单,更直接,更不容易出错:

    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 [亚/曼谷]

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

您的代码出了什么问题?

在格式模式字符串中,您使用小写hh表示小时数,在示例中使用12小时。 {01}在上午或下午从01到12为小时。如果未指定上午或下午,hh将默认使用AM。 12:26 AM意味着午夜过了26分钟,与24小时制00:26相同。所以这就是SimpleDateFormat给你的。

你很幸运能够以12小时的时间进行测试。其他小时工作正如你所预料的那样,尽管你有错误。其他人也犯了同样的错误,并且很久没有被注意到了。为了进行比较,现代API会在类似的情况下抛出一个异常,让您知道丢失的AM / PM标记。我显然更喜欢这种行为。

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

是的,SimpleDateFormat适用于较旧和较新的Android设备。它只需要至少Java 6

  • 在Java 8及更高版本和更新的Android设备上(来自API级别26,我被告知)现代API内置。
  • 在Java 6和7中获取ThreeTen Backport,新类的后端端口(适用于JSR 310的ThreeTen;请参阅底部的链接)。
  • On(较旧)Android使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保使用子包从java.time导入日期和时间类。

链接

答案 2 :(得分:0)

试试这段代码..

   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();
    }