Java hh:mm a和hh:mm a之间的差异
这是我的原始代码-Java hh:mm a和hh:mm a之间的差异,java,date,simpledateformat,jdk1.6,Java,Date,Simpledateformat,Jdk1.6,这是我的原始代码- 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;
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
,这不应该以24小时格式返回时间吗
(或)
如果默认为12小时格式,是否应根据提供的日期输入返回相应的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标记,有关更多信息,请转到更新的答案
这里的问题是程序流
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm a");
此简单日期格式化程序
用于格式化日期字符串。创建日期对象,以下是答案的重要部分
当您使用HH而不是HH时,SimpleDateFormat会认为提供的日期字符串是24小时格式的
,并且只忽略此处的AM/PM标记
从这个SimpleDataFormatter构造的Date对象被传递给
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");
与
一切都会顺利的
注意:创建区域设置时,应将语言代码传递给locale()构造函数<代码>美国英语
不美国英语
IMP:代码也在Java8上测试<代码>Java(TM)SE运行时环境(build 1.8.0_121-b13)一个简单的测试是解释模式“HH:mm A”的最佳答案。首先让我们研究一下打印模式: 旧格式引擎
SimpleDataFormat
:
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
LocalTime time = LocalTime.of(17, 59);
DateTimeFormatter tf = DateTimeFormatter.ofPattern("HH:mm a", Locale.US);
System.out.println(tf.format(time)); // 17:59 PM
Java-8(使用新的包Java.time.format
):
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
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”的组合是编程错误的指示(用户显然没有充分考虑这些模式符号的含义和官方描述)
现在让我们研究一下解析模式(我们将使用严格模式来观察幕后的真实情况):
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
此消息告诉我们,值为“1”的解析小时(24小时格式!)表示AM,而文本输入包含另一个解析的AM/PM值“PM”。这种矛盾无法解决
教训:我们必须谨慎地进行宽松的解析,因为有矛盾的信息可能被忽略,并导致错误的假设。公认的@Arjun的答案是完全错误的
顺便说一下:请使用
Locale.US
或new Locale(“en”,“US”)
而不是new Locale(“en-US”)
,因为“en-US”语言不存在。谢谢@MenoHochschild。请再看一次我的答案!很好,但是推荐新语言环境(“en-us”)
仍然是错误的。@MenoHochschild恕我直言,我想知道您我们可以用Java 8(1.8.0121)
从我的回答中所述的语言构建一个语言环境!请参考Java8包java.util.Locale
第700行的代码片段,它清楚地说明了我们可以从语言构造语言环境。我指的是Java8(1.8.0-121)
我甚至使用了1.8.0-131。问题是:“en-us”只是一个语言代码,并没有指向美国(方法getCountry()
为空!)。很明显,“en-us”在某种程度上被解释为JRE中某个地方的英语,因此让你认为它会起作用。API非常清楚,单参数的locale构造函数只使用纯语言参数。。。不是这个国家。例如,如果必须确定国家相关周规则,这一点很重要-在美国或英国不同。Hello@MenoHochschild请查看答案!谢谢你的建设性批评!我想听听你的意见!