我不确定这是否总是会发布一个2位数的月份:
java.time.LocalDateTime ldt = java.time.LocalDateTime.now( java.time.ZoneId.of( "America/New_York" ));
String path = "my/path/" + ldt.getYear().toString() + "/" + ldt.getMonthValue().toString() + "/" + ldt.getDayOfMonth().toString() + "/" + ldt.getHour().toString() + "/";
现在确实如此,因为我们正处于两位数的月份。例如,如何检查它在7月份是否有效?
无法使用"%02d";格式化。
抱歉,Java新手。
tl;dr
将您的请求切换为使用标准ISO 8601格式…
"my/path/" +
ZonedDateTime.now(
ZoneId.of( "America/New_York" )
)
.format(
DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH" )
)
.toString()
运行时:
my/path/2020-11-17T21
DateTimeFormatter
让java.time.format.DateTimeFormatter
类来完成格式化工作。您无需操作字符串。
双字符(如dd
而非d
(在需要的地方强制使用前导零。仔细阅读类Javadoc以理解格式化代码。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu/MM/dd/HH" ) ;
String s = ldt.format( f ) ;
ISO 8601
您的斜杠字符(SOLIDUS(可以解释为文件夹/目录的含义。因此,我建议您坚持使用标准化的ISO8601格式。标准格式保留年月日小时顺序,但使用HYPHEN字符作为分隔符。并且T
将一天中的时间与日期部分分开。
默认情况下,java.time类使用ISO8601格式。因此,无需指定任何格式模式。
当你在做的时候,我也会用分钟,所以日期和时间很容易识别。如果您希望时间始终为零分钟,请将其截断为小时。
String s = ldt.truncatedTo( java.time.temporal.ChronoUnit.HOURS ).toString() ;
最后一期:在一些流行的文件系统中,COLON字符也可以被解释为文件夹/目录。因此,我们应该避免在小时和分钟之间使用COLON字符。请参阅兄弟网站上的此问题http://www.AskDifferent.com/关于这方面的策略。
或者你可能只想坚持一小时而不想坚持一分钟。
综合来看:
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH" ) ;
ZoneId z = ZoneId.of( "America/New_York" ) ;
LocalDateTime ldt = LocalDateTime.now( z ) ;
String s = ldt.format( f ) ;
String output = "my/path/" + s ;
System.out.println( "output → " + output ) ;
请在IdeOne.com上实时查看此代码。
输出→my/path/2020-11-17T21
LocalDateTime
不是瞬间
顺便说一句,你明白LocalDateTime
不代表一个时刻吗?它故意没有任何时区或UTC偏移量的概念。这种类型代表2021年1月23日这样的日期和中午这样的时间,但我们不知道这是指东京23日中午、巴黎23日中午还是蒙特利尔23日中午,三个相隔几个小时的非常不同的时刻。因此,您的代码java.time.LocalDateTime.now( java.time.ZoneId.of( "America/New_York" ))
可能无法满足您的期望。
要捕捉瞬间,请使用Instant
(始终使用UTC(、OffsetDateTime
或ZonedDateTime
。