如何正确格式化java时间
下面是我的时间格式化代码 public class FormatTime { public static void main(String[] args) throws Exception { FormatTime ft = new FormatTime(); System.out.println(ft.evaluate("12/01/2014 05:30:15 PM","MM/dd/yyyy hh:mm:ss aa", "yyyy-MM-dd HH:mm:ss")); } public String evaluate(String time,String iFormat ,String f) throws ParseException { SimpleDateFormat format = new SimpleDateFormat(f); SimpleDateFormat inFormat = new SimpleDateFormat(iFormat); Date date=inFormat.parse(time); String fechaNueva = format.format(date); return fechaNueva; } } 公共类格式化时间{ 公共静态void main(字符串[]args)引发异常{ FormatTime ft=新的FormatTime(); 系统输出打印LN(ft.evaluate(“2014年1月12日05:30:15下午”,“年/月/日hh:MM:ss aa”,“年/月/日hh:MM:ss”); } 公共字符串求值(字符串时间、字符串格式、字符串f)引发ParseException{ SimpleDataFormat格式=新的SimpleDataFormat(f); SimpleDataFormat inFormat=新的SimpleDataFormat(iFormat); 日期=信息解析(时间); 字符串fechaNueva=format.format(日期); 返回费切努埃瓦; } } 该项目的产出与预期一致,为2014-12-01 17:30:15。如何正确格式化java时间,java,date,Java,Date,下面是我的时间格式化代码 public class FormatTime { public static void main(String[] args) throws Exception { FormatTime ft = new FormatTime(); System.out.println(ft.evaluate("12/01/2014 05:30:15 PM","MM/dd/yyyy hh:mm:ss aa", "yyyy-MM-dd HH:m
但当我将iFormat中的hh替换为hh时(与outputformat中的相同),它将以12 out格式输出2014-12-01 05:30:15
同样的情况也会发生,如果我将两者转换为小写形式,即hh。为什么会出现这种不一致性?我不认为这是不一致的。使用
HH
计算时间时,它将忽略aa
位,因为它将输入计算为24小时时间,aa
位没有意义。但是,当您使用hh
运行它时,它会将05:30:15 PM
读为“下午五点半”,并将其写入2014-12-01 17:30:15
。阅读05:30:15 PM
作为一个24小时的时间,会读为“早上五点半”,把PM
的部分扔掉
当两种格式都使用hh
时,您的阅读和书写都是12小时格式。为了使at有意义,您还需要将aa
位添加到输出格式中
我希望以一种有意义的方式回答你的问题:)tl;博士
java.time
现代方法使用java.time类取代了麻烦的旧日期时间类
以UTC为单位获取当前时刻。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)
要通过某个地区(时区)的人使用的挂钟时间来查看同一时刻,请应用ZoneId
获取zoneDateTime
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
要在其中任何一个上生成标准ISO 8601格式的字符串,请调用toString
。在配对/生成字符串时,java.time类默认使用标准格式。因此,无需指定格式化模式
如果需要其他格式,请使用DateTimeFormatter
或DateTimeFormatterBuilder
类。您可以指定格式模式,但更容易让java.time自动本地化
要本地化,请指定:
- 确定字符串的长度或缩写
- 确定(a)用于翻译日名、月名等的人类语言,以及(b)决定缩写、大写、标点符号、分隔符等问题的文化规范
Locale l = Locale.FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( l );
String output = zdt.format( f );
mercredi 14 février 2018á00:59:07欧洲中央师范大学
或者,Locale.US
&FormatStyle.SHORT
2018年2月14日凌晨1:01
您输入的自定义格式为:
String input = "12/01/2014 05:30:15 PM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu hh:mm:ss a" , Locale.US ) ;
该输入字符串缺少时区或UTC偏移量的任何指示器。因此,这不是一个时刻,也不是时间线上的一个特定点。它代表了一个关于26-27小时范围内潜在时刻的模糊概念。因此,我们将此输入解析为一个LocalDateTime
,其中没有任何区域/偏移的概念
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
ldt.toString():2014-12-01T17:30:15
生成该格式的字符串
String output = ldt.format( f ) ;
2014年1月12日下午5:30:15
正如其他人所解释的,格式化代码区分大小写。如果需要24小时制,请使用大写字母H
。对于12小时的时间,请使用小写字母h
请注意,java.time中的格式代码与传统的SimpleDataFormat
中的格式代码相近,但并不完全相同。研究文档和搜索堆栈溢出的许多例子
当以文本形式交换日期时间值时,请坚持使用标准格式
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 使用兼容的或更高版本,您可以直接与数据库交换java.time对象。不需要字符串,也不需要java.sql.*类 从哪里获得java.time类
- ,及以后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。你可以在这里找到一些有用的类,如、、和。如果你在iFormat中用hh替换hh,那么05:30:15的时间被解读为24小时时钟,而PM被忽略…@agarwal_achhnera确实帮了你我不确定为什么这个问题被否决。或许选民可以解释他/她的理由??当然,代码中有一个错误,但这就是stackoverflow问题的本质。错误
String input = "12/01/2014 05:30:15 PM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu hh:mm:ss a" , Locale.US ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
String output = ldt.format( f ) ;