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

标签 java android date datetime jodatime

我正在尝试转换一个 int (代表军事时间)并将其转换为民用时间。例如,如果我有“13”小时,我想将其转换为“1:00 pm”。这是我一直在尝试的:

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();

日志猫:

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 不允许我重新格式化小时,我收到“8:00 太短”类型的错误,这就是为什么我包含日期并将日期和时间合并到一个字符串中,即使我不这样做不需要日期。我也尝试过使用其中的时区组件,但出现了相同的错误。仅用于背景:int“小时”来自数据库查询的时间戳(UTC 带时区偏移),该数据库查询吐出我需要的小时列表。所以我回来的时间已经考虑到了时区。

本质上,我试图从一天中的“HH”小时(0-23)变为半天的“hh:mm a”时钟小时(1-12)。我假设有时“HH”只是“H”,因为从数据库查询到应用程序时前导零被删除。我已经用 hour = 8 和 hour = 10 尝试过此操作,但产生了相同的错误。

最佳答案

感谢其中一条评论使用LocalTime ,这就完成了:

private DateTimeFormatter hourFormat = DateTimeFormat.forPattern("h:mm a");   
int hour = 8;
String ltime = new LocalTime(hour,0).toString(hourFormat);

在格式模式中,DateTimeFormat Joda-time 类表示使用:

  • h(小写)表示半天的时钟时间(1~12)
  • H(大写)代表一天中的小时 (0~23)

如果您想为单个数字值填充前导 0(零),请使用 double hh。例如,获取 08:00 而不是 8:00。解析时,接受任意数量的数字。

关于Java 使用 Joda 时间将军事时间转换为民用时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35042889/

相关文章:

java - 如何计算两次之间的差异

java - 如何使用 Apache Commons FileUpload 一次上传多个文件?

java - AES加密和解密Java

android - 针对 android 中较低的 SDK 版本

android - 如何在android中写入/读取数组到文件

Unix 中日期的正则表达式

java - 强制服务器等待,因为图像尚未完成写入磁盘

java - 检测 RefreshScope bean 的刷新

android - 表面 View 中的触摸事件和手势

python - 在 numpy.where 中访问对象方法?