hh:mm a 和 HH:mm a 的区别
Difference between hh:mm a and HH:mm a
这是我的原代码-
String dateString = "23 Dec 2015 1:4 PM";
Locale locale = new Locale("en_US");
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm a");
DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm a", locale);
Date date = null;
try {
date = formatter.parse(dateString);
} catch (ParseException e) {
LOGGER.error(e);
}
String newDate = df.format(date);
System.out.println("oldDate = " + dateString);
System.out.println("newDate = " + newDate);
这是我的输出-
oldDate = 23 Dec 2015 1:4 PM
newDate = 23 Dec 2015 01:04 AM
oldDate
和 newDate
之间有 AM-PM 差异。现在我将 DateFormat
代码更改为 -
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy hh:mm a");
DateFormat df = new SimpleDateFormat("dd MMM yyyy hh:mm a", locale);
我得到了预期的输出,即-
oldDate = 23 Dec 2015 1:4 PM
newDate = 23 Dec 2015 01:04 PM
我知道 HH
表示 24 小时 格式,hh
表示 12 小时格式。
我的问题是
如果我使用 HH:mm a
而不是 hh:mm a
,这不应该是 return24 小时 格式的时间吗?
(或)
如果默认为 12 小时 格式,是否应该根据提供的日期输入 return 相应的 AM/PM 标记?
这只是我的理解。
hh:mm和HH:mm的区别:
HH:mm => will look like 00:12, 23:00... this has 24 hour format.
hh:mm => will look like 01:00Am, 02:00Am,...01:00pm this has 12 hour format.
hh:mm a 或 HH:mm a 中的 a
是 Am/pm 标记以获取更多信息,请访问 link
更新答案
这里的问题是 Program flow
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm a");
这个simple date formatter
用于格式化创建日期对象的日期字符串,这里是answer
的重要部分
当您使用 HH 而不是 hh 时,SimpleDateFormater 认为提供的日期字符串在 24-Hour Format
中,只是 忽略 这里的 AM/PM marker
。
从这个 SimpleDateFormatter 构造的日期对象被传递给
DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm a", locale);
这就是打印的原因
newDate = 23 Dec 2015 01:04 AM
如果你换行
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm a");
和
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy hh:mm a");
一切都会如愿以偿!
注意 :创建语言环境时,您应该将语言代码传递给 Locale() 构造函数。 en-us
不是 en_us
。
IMP :代码也在 Java 8 上进行了测试。 Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
一个简单的测试是解释模式 "HH:mm a" 的最佳答案。首先让我们研究一下打印模式:
旧格式引擎SimpleDateFormat
:
Calendar cal = new GregorianCalendar(2015, 3, 1, 17, 45);
SimpleDateFormat sf = new SimpleDateFormat("HH:mm a", Locale.US);
System.out.println(sf.format(cal.getTime())); // 17:45 PM
Java-8(使用新包java.time.format
):
LocalTime time = LocalTime.of(17, 59);
DateTimeFormatter tf = DateTimeFormatter.ofPattern("HH:mm a", Locale.US);
System.out.println(tf.format(time)); // 17:59 PM
这里 我们在这两种情况下都没有观察到任何覆盖。我更喜欢这种方法,因为在我看来,使用 "HH" 和 "a" 的组合更像是一个编程错误的指示(用户显然没有充分考虑这些模式符号的含义和官方描述) .
现在让我们研究一下解析模式(我们将使用严格模式来观察幕后真正发生的事情):
String dateString = "23 Dec 2015 1:4 PM";
SimpleDateFormat df = new SimpleDateFormat("dd MMM yyyy H:m a", Locale.US);
df.setLenient(false);
Date date = df.parse(dateString);
// java.text.ParseException: Unparseable date: "23 Dec 2015 1:4 PM"
Java-8 中的行为如何?它是一样的,但有一个更清晰的错误信息:
DateTimeFormatter tf = DateTimeFormatter.ofPattern("H:m a", Locale.US);
tf = tf.withResolverStyle(ResolverStyle.STRICT);
LocalTime.parse("1:4 PM", tf);
// DateTimeException: Cross check failed: AmPmOfDay 0 vs AmPmOfDay 1
此消息告诉我们解析的小时(以 24 小时格式!)值为“1”表示上午,而文本输入包含其他解析的 AM/PM-value "PM"。这种矛盾无法解决。
经验教训:我们必须小心宽松的解析,其中可能会忽略矛盾的信息并导致错误的假设。@Arjun 接受的答案是完全错误的。
顺便说一句:请使用 Locale.US
或 new Locale("en", "US")
而不是 new Locale("en-US")
,因为语言 "en-US" 不存在。
这是我的原代码-
String dateString = "23 Dec 2015 1:4 PM";
Locale locale = new Locale("en_US");
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm a");
DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm a", locale);
Date date = null;
try {
date = formatter.parse(dateString);
} catch (ParseException e) {
LOGGER.error(e);
}
String newDate = df.format(date);
System.out.println("oldDate = " + dateString);
System.out.println("newDate = " + newDate);
这是我的输出-
oldDate = 23 Dec 2015 1:4 PM
newDate = 23 Dec 2015 01:04 AM
oldDate
和 newDate
之间有 AM-PM 差异。现在我将 DateFormat
代码更改为 -
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy hh:mm a");
DateFormat df = new SimpleDateFormat("dd MMM yyyy hh:mm a", locale);
我得到了预期的输出,即-
oldDate = 23 Dec 2015 1:4 PM
newDate = 23 Dec 2015 01:04 PM
我知道 HH
表示 24 小时 格式,hh
表示 12 小时格式。
我的问题是
如果我使用 HH:mm a
而不是 hh:mm a
,这不应该是 return24 小时 格式的时间吗?
(或)
如果默认为 12 小时 格式,是否应该根据提供的日期输入 return 相应的 AM/PM 标记?
这只是我的理解。
hh:mm和HH:mm的区别:
HH:mm => will look like 00:12, 23:00... this has 24 hour format.
hh:mm => will look like 01:00Am, 02:00Am,...01:00pm this has 12 hour format.
hh:mm a 或 HH:mm a 中的 a
是 Am/pm 标记以获取更多信息,请访问 link
更新答案
这里的问题是 Program flow
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm a");
这个simple date formatter
用于格式化创建日期对象的日期字符串,这里是answer
当您使用 HH 而不是 hh 时,SimpleDateFormater 认为提供的日期字符串在 24-Hour Format
中,只是 忽略 这里的 AM/PM marker
。
从这个 SimpleDateFormatter 构造的日期对象被传递给
DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm a", locale);
这就是打印的原因
newDate = 23 Dec 2015 01:04 AM
如果你换行
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm a");
和
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy hh:mm a");
一切都会如愿以偿!
注意 :创建语言环境时,您应该将语言代码传递给 Locale() 构造函数。 en-us
不是 en_us
。
IMP :代码也在 Java 8 上进行了测试。 Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
一个简单的测试是解释模式 "HH:mm a" 的最佳答案。首先让我们研究一下打印模式:
旧格式引擎SimpleDateFormat
:
Calendar cal = new GregorianCalendar(2015, 3, 1, 17, 45);
SimpleDateFormat sf = new SimpleDateFormat("HH:mm a", Locale.US);
System.out.println(sf.format(cal.getTime())); // 17:45 PM
Java-8(使用新包java.time.format
):
LocalTime time = LocalTime.of(17, 59);
DateTimeFormatter tf = DateTimeFormatter.ofPattern("HH:mm a", Locale.US);
System.out.println(tf.format(time)); // 17:59 PM
这里 我们在这两种情况下都没有观察到任何覆盖。我更喜欢这种方法,因为在我看来,使用 "HH" 和 "a" 的组合更像是一个编程错误的指示(用户显然没有充分考虑这些模式符号的含义和官方描述) .
现在让我们研究一下解析模式(我们将使用严格模式来观察幕后真正发生的事情):
String dateString = "23 Dec 2015 1:4 PM";
SimpleDateFormat df = new SimpleDateFormat("dd MMM yyyy H:m a", Locale.US);
df.setLenient(false);
Date date = df.parse(dateString);
// java.text.ParseException: Unparseable date: "23 Dec 2015 1:4 PM"
Java-8 中的行为如何?它是一样的,但有一个更清晰的错误信息:
DateTimeFormatter tf = DateTimeFormatter.ofPattern("H:m a", Locale.US);
tf = tf.withResolverStyle(ResolverStyle.STRICT);
LocalTime.parse("1:4 PM", tf);
// DateTimeException: Cross check failed: AmPmOfDay 0 vs AmPmOfDay 1
此消息告诉我们解析的小时(以 24 小时格式!)值为“1”表示上午,而文本输入包含其他解析的 AM/PM-value "PM"。这种矛盾无法解决。
经验教训:我们必须小心宽松的解析,其中可能会忽略矛盾的信息并导致错误的假设。@Arjun 接受的答案是完全错误的。
顺便说一句:请使用 Locale.US
或 new Locale("en", "US")
而不是 new Locale("en-US")
,因为语言 "en-US" 不存在。