2

yy = 15(年),D = 150(一年中的一天),HH = 10(小时)

 Date myDateWrong = new SimpleDateFormat("yyDHH").parse("1515010");
 Date myDateTrue = new SimpleDateFormat("yyD").parse("15150");

myDateTrue 是对的:2015 年 5 月 30 日。myDateWrong 必须是 30/05/2015 10:00:00,但似乎是 28/07/2015 18:00:00。这里有什么问题?

4

4 回答 4

2

我猜 wrongDate 拿了一个数字的月份(如你所指定),然后取其余的数字为一小时(就像它从原始格式中取了 julian 日期的其余数字一样)。所以你得到了 2015 年、1 月和 5010 小时。我没有详细计算过,但 5010 小时将给您大约 7 个月的时间,这可以解释在 7 月结束。18:00 仅反映剩余的时间。

因此,您需要使用 DDD 作为儒略日的说明符(而不是 ddd 另一条评论中建议的),然后它会按预期出现。

于 2015-05-25T13:49:57.540 回答
1

你的格式不正确。你应该使用:

Date myDateWrong = new SimpleDateFormat("yydddhh").parse("1515010");
于 2015-05-25T13:38:18.030 回答
0

你需要15150......30/05/2015但实际上是 12:00:00 试试这个

String j = "15150";
Date date = new SimpleDateFormat("yyD").parse(j);
String g = new SimpleDateFormat("dd.MM.yyyy hh:mm").format(date);
System.out.println(g);
于 2015-05-25T13:39:47.957 回答
0

tl;博士

LocalDateTime ldt = LocalDateTime.parse ( "1515010" , DateTimeFormatter.ofPattern ( "yyDHH" ) );
LocalDate ld = LocalDate.parse ( "15150" , DateTimeFormatter.ofPattern ( "yyD" ) );

不是朱利安……序数日期

使用术语“朱利安”来表示一年中的有序数字在技术上并不正确,但仍然普遍使用。我建议您避免与实际的儒略日期产生歧义和混淆,并坚持使用准确的术语序数日期或“一年中的日期”。

java.time

Java 8 及更高版本中内置的java.time框架可以在这里提供帮助。下面的示例代码证明您的两种方案(有和没有时间)在 java.time 中都能正常工作。

这些 java.time 类取代了旧的麻烦的日期时间类,例如java.util.Date. 请参阅Oracle 教程。大部分功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在ThreeTenABP进一步适应 Android 。

使用类定义格式化程序模式DateTimeFormatter。格式代码与 的相似SimpleDateFormat,但不完全相同,因此请研究类文档。对于此类,如果省略世纪,20xx则假定为 21 世纪 ( )。

String input = "1515010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyDHH" );

LocalDateTime ldt = LocalDateTime.parse ( input , formatter );

ALocalDateTime缺少任何时区或与 UTC 的偏移信息。所以它并不代表时间线上的一个时刻。如果我们可以假设此输入的目的是在 UTC 时区的上下文中,则转换为OffsetDateTime.

OffsetDateTime odt = ldt.atOffset ( ZoneOffset.UTC );

转储到控制台。

System.out.println ( "input: " + input + " | ldt: " + ldt + " | odt: " + odt );

输入:1515010 | 日期:2015-05-30T10:00 | odt: 2015-05-30T10:00Z

对于没有时间和时区的仅日期值,我们实例化一个LocalDate.

String input = "15150";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyD" );
LocalDate ld = LocalDate.parse ( input , formatter );

转储到控制台。

System.out.println ( "input: " + input + " | ld: " + ld );

输入:15150 | 日期:2015-05-30

于 2016-07-09T05:13:22.557 回答