12:xx在SimpleDateFormat.format中显示为00:xx(“hh:mm:ss”)

时间:2018-04-07 14:33:55

标签: java simpledateformat

在以下代码中使用SimpleDateFormatter.format时,在12:00和12:59之间的小时在startDateText TextView中显示为00:00到00:59,而从13:00开始它们正确显示为13:xx ,14:xx到23:59。

----按要求重构代码 当dtold.parse(...)中的字符串是示例时,输出小时是00:00,当它是“13:00”时,它是正确的“13:00”

import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;


// one class needs to have a main() method
public class HelloWorld
{
  // arguments are passed using the text field below this editor
  public static void main(String[] args)
  {
        SimpleDateFormat dtnew = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        SimpleDateFormat dtold = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

            try {

            Calendar cal = Calendar.getInstance();
            cal.setTime(dtold.parse("2017-03-12 12:33:33"));
            cal.add(Calendar.SECOND, 10);
            System.out.println(dtnew.format(cal.getTime()));

        } catch (Exception e) {

            throw new RuntimeException(e);
        }


  }
}

1 个答案:

答案 0 :(得分:2)

首先是像你这样的几个格式化程序,只使用DateTimeFormatter中的java.time,即现代Java日期和时间API:

private static DateTimeFormatter dtfOld = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private static DateTimeFormatter dtfNew = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");

需要注意两点:(1)按逻辑顺序声明格式化程序,即使用它们的顺序。在问题中使用相反的顺序使我感到困惑,我不确定它是否也使自己感到困惑。 (2)在dtfOld中使用大写HH表示时间间隔为00到23.小写hh表示AM或PM从01到12(在这种情况下相同)格式模式字母适用于SimpleDateFormatDateTimeFormatter;但也存在差异。现在其余的都很无聊,只比你的代码简单:

    LocalDateTime parsed = LocalDateTime.parse("2017-03-12 12:33:33", dtfOld);
    System.out.println(parsed);
    LocalDateTime dateTime = parsed.plusSeconds(10);
    System.out.println(dateTime);
    System.out.println(dateTime.format(dtfNew));

输出是:

2017-03-12T12:33:33
2017-03-12T12:33:43
12-03-2017 12:33:43

我推荐java.time。您使用的旧日期和时间类 - SimpleDateFormatCalendarDate - 已过时。在这种情况下,现代类不仅允许更简单的代码,而且非常常见。我发现java.time通常可以更好地使用。

您的代码出了什么问题?

我已经给出了一个提示:小写hh在AM或PM从01到12的小时内。当您不提供和解析AM / PM标记时,AM被用作默认值。 12:33:33 AM意味着午夜过半个小时,并且24小时制作时间为00:33:33。

从13:00到23:59的时间?它们在AM中不存在。显然SimpleDateFormat并不关心,只是从01到11的时间推断,因此恰好给你你预期的时间。有一个诀窍告诉它不要;但我不想打扰,我宁愿根本不使用这个课程。

链接

Oracle tutorial: Date Time解释如何使用java.time