如何在不使用格式化字符串文字的情况下保证Java中的2位数月份



我不确定这是否总是会发布一个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(、OffsetDateTimeZonedDateTime

最新更新