Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hh:mm a和hh:mm a之间的差异_Java_Date_Simpledateformat_Jdk1.6 - Fatal编程技术网

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请查看答案!谢谢你的建设性批评!我想听听你的意见!