datetime—如何在java中保证两位数的月份而不使用格式化字符串文字?

7gs2gvoe  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(412)

我不确定这个月是否总是两位数:

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 。

blpfk2vs

blpfk2vs1#

热释光;博士

正在切换您的请求以使用标准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

日期时间格式

java.time.format.DateTimeFormatter 全班做你的格式化工作。你不需要操纵绳子。
双重性格,如 dd 而不是 d 在需要的地方强制一个前导零。仔细阅读javadoc类以理解格式化代码。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu/MM/dd/HH" ) ;
String s = ldt.format( f ) ;

iso 8601标准

斜杠字符(solidus)可以解释为一个文件夹/目录。所以我建议你坚持标准化的ISO8601格式。标准格式保持年-月-日-小时顺序,但使用连字符作为分隔符。和一个 T 将一天中的时间与日期部分分开。
默认情况下,java.time类使用iso8601格式。所以不需要指定任何格式模式。
当你在做的时候,我也会用分钟,所以日期和时间很容易辨认。如果你一直想要一个零分钟,就把时间缩短到小时。

String s = ldt.truncatedTo( java.time.temporal.ChronoUnit.HOURS ).toString() ;

最后一个问题:在一些流行的文件系统中,冒号字符也可以解释为文件夹/目录。所以我们应该避免在小时和分钟之间使用冒号字符。在兄弟网站上看到这个问题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 .

相关问题