繁体   English   中英

如何将字符串转换为日期(HHMMMDD)(小时,月,日)

[英]how to convert string to date (HHMMMDD) (hour, month, day-of-month)

我尝试将字符串转换为日期类型。 这就是我所做的全部。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HHMMMDD");

String date = "23Mar25";

System.out.println(date);

LocalDate localDate = LocalDate.parse(date, formatter);

System.out.println(localDate);

我得到了错误信息

Text '23Mar25' could not be parsed: 
Unable to obtain LocalDate from TemporalAccessor: 
{MonthOfYear=3, DayOfYear=25},ISO resolved to 23:00 of type 
java.time.format.Parsed at 
java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)

有人可以帮我解决吗?

tl; dr

LocalTime.parse( "23Mar25" , DateTimeFormatter.ofPattern ( "HHMMMdd", Locale.US )
         .toString()  // 23:00

…和…

MonthDay.parse( "23Mar25" , DateTimeFormatter.ofPattern ( "HHMMMdd", Locale.US )
        .toString()   // --03-25

细节

如果您确定输入确实代表一个小时,一个月和一个月中的某天…

DateTimeFormatter

定义一个DateTimeFormatter 确保为人类语言指定Locale ,以翻译月份的缩写名称。

String input = "23Mar25";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "HHMMMdd", Locale.US );

LocalTime

两次使用该格式化程序。 一次产生一个一天中的时间作为LocalTime对象以保持一天中的小时。

LocalTime lt = LocalTime.parse ( input, f );

MonthDay

再次产生一个MonthDay对象来保存月份和月份。

MonthDay md = MonthDay.parse ( input , f  );

ZoneId

要使该时刻成为特定值,我们必须指定一个年份和一个时区。 如果要使用当前年份,则也需要一个时区。 请记住,在任何给定时刻,日期和时间在全球范围内都会发生变化。

continent/region的格式指定正确的时区名称 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 切勿使用ESTIST等3-4个字母的缩写,因为它们不是真实的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of ( "America/Montreal" ); 

LocalDate

通过为我们的MonthDay对象分配年份来确定LocalDate对象。

int yearNumber = Year.now ( z )
                     .getValue ( ) ;
LocalDate ld = md.atYear ( yearNumber );

ZonedDateTime

LocalTime结合使用以获取准确的时刻,即时间轴上的一点。 结果是一个ZonedDateTime对象。

ZonedDateTime zdt = ZonedDateTime.of ( ld, lt, z );

转储到控制台。

System.out.println ( "input: " + input );
System.out.println ( "lt: " + lt );
System.out.println ( "md: " + md );
System.out.println ( "ld: " + ld );
System.out.println ( "zdt: " + zdt );

输入:25年3月23日

lt:23:00

md:-03-25

ld:2017-03-25

zdt:2017-03-25T23:00-04:00 [美国/蒙特利尔]

OffsetDateTime

如果您的输入用于UTC ,则可以使用ZoneOffset.UTC常量和OffsetDateTime类代替上面的代码,而不是ZoneIdZonedDateTime

OffsetDateTime zdt = OffsetDateTime.of ( ld, lt, ZoneOffset.UTC );

ISO 8601

注意输出,即toString方法生成的字符串。 解析/生成字符串时,java.time类默认使用ISO 8601标准格式。 我强烈建议您和您的数据源使用这些标准格式,而不要像在“问题”中看到的那样发明自己的格式。 java.time类可以直接解析以及生成此类标准字符串,而无需指定格式化模式。

若要生成其他格式的字符串,请使用DateTimeFormatter类。 该主题在其他许多Stack Overflow页面中都有介绍,因此请搜索许多示例和更多讨论。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HHMMMDD");

它使用以下模式:

HH: 2 spaces for hour
MMM: 3 spaces for month
DD: 2 spaces for day

我认为您需要这样的格式:`ddmmmyy

dd: 2 spaces for day
mmm: 3 spaces for month
yy: 2 spaces for year

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM