我试图转换一个int(代表军事时间)并将其转换为民用时间。例如,如果我有时间" 13"我想把它转换为"下午1点和#34;。以下是我一直在尝试的内容:
private DateTimeFormatter hourFormat = DateTimeFormat.forPattern("hh:mm a");
private DateTimeFormatter dateFormat = DateTimeFormat.forPattern("YYYY-MM-dd");
int hour = 8;
DateTime fullDate = new DateTime();
String date = dateFormat.print(fullDate) + " " + Integer.toString(hour) + ":00";
String civilianTime = hourFormat.parseDateTime(date).toString();
logcat的:
java.lang.IllegalArgumentException: Invalid format: "2016-01-27 8:00" is malformed at "16-01-27 8:00"
at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:945)
Joda不允许我重新格式化小时,我得到的时间太短了#34;错误的类型,这就是为什么我包括日期并将日期和时间合并为一个字符串,即使我不需要约会。我也试过在那里使用时区组件,但我得到了同样的错误。仅供参考:int" hour"来自数据库查询的时间戳(UTC w / timezone offset),该数据库查询会显示我需要的小时数列表。所以我回来的时间已经考虑了时区。
本质上,我试图从" HH"小时(0-23)到" hh:mm a"半天的时钟(1-12)。我有时会假设" HH"只是" H"因为从数据库查询到应用程序时,前导零被删除。我已经尝试了这个,小时= 8,小时= 10,结果相同。
答案 0 :(得分:2)
感谢其中一条使用LocalTime
的评论,这就完成了:
private DateTimeFormatter hourFormat = DateTimeFormat.forPattern("h:mm a");
int hour = 8;
String ltime = new LocalTime(hour,0).toString(hourFormat);
在格式模式中,Joda-time的DateTimeFormat
类使用:
h
(小写)表示半天(1~12)的时钟H
(大写)表示一天中的小时(0~23)如果要为单个数字值填充前导hh
(零),请使用双0
。例如,获取08:00
而不是8:00
。解析时,接受任意数量的数字。
答案 1 :(得分:0)
使用java.time而不是Joda-Time。
LocalTime.of( 13 , 0 )
.format(
DateTimeFormatter.ofLocalizedTime( FormatStyle.SHORT )
.withLocale( Locale.US )
)
下午1:00
请参阅此code run live at IdeOne.com。
...或...
ZonedDateTime.of(
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) ) , // Get today’s date at this moment in this time zone.
LocalTime.of( 13 , 0 ) , // Specify the time-of-day given to us. In this example `13` for 1 PM is given to us.
ZoneId.of( "Pacific/Auckland" ) // Specify the time zone giving the context for this date-time.
).format( // Generate a string representing the value of this date-time object.
DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT )
.withLocale( Locale.US ) // Localize using the language and cultural norms of the United States.
)
5/4/17 1:00 PM
Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time课程。请参阅Tutorial by Oracle。
LocalTime
和LocalDate
类代表日期时间的每个部分,没有任何offset-from-UTC或时区。
int hour = 13 ; // 24-hour clock, 0-23. So `13` is 1 PM.
LocalTime lt = LocalTime.of( hour , 0 ); // ( hours , minutes )
lt.toString():13:00
让java.time为您本地化。
要进行本地化,请指定:
FormatStyle
确定字符串的长度或缩写。 Locale
确定(a)翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大小写,标点符号,分隔符问题的文化规范等等。
DateTimeFormatter f = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).withLocale(Locale.US); 字符串输出= lt.format(f);
输出:下午1:00
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate ld = LocalDate.now( z );
ld.toString():2017-01-23
要到达时间轴上的特定点,我们会应用时区(ZoneId
对象)来获取ZonedDateTime
。
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ; // ( LocalDate , LocalTime , ZoneId )
zdt.toString():2017-01-23T13:00:00-05:00 [美国/蒙特利尔]
以您想要的格式生成一个字符串。如上所示,让java.time为您本地化。
DateTimeFormatter f2 = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT ).withLocale( Locale.US ) ;
String output2 = zdt.format( f2 );
5/4/17 1:00 PM
请参阅此code run live at IdeOne.com。
顺便说一句,提到military time时“the 24-hour clock”一词主要是美国现象,因为美国是12小时制占主导地位的罕见地区之一。
全球其他人通常都会同时使用两者,指的是休闲事项的12小时制,以及火车时刻表等关键事项的24小时制。根据我的经验,这是一个更明智的做法。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?