Java用Joda时间将军事小时转换为平民时间

时间:2016-01-27 16:31:58

标签: java android date datetime jodatime

我试图转换一个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,结果相同。

2 个答案:

答案 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)

TL;博士

使用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

使用java.time

LocalTimeLocalDate类代表日期时间的每个部分,没有任何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/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?