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

Java 如何将字符串转换为日期(HHMMMDD)(小时、月、月日),java,string,date,datetime,converter,Java,String,Date,Datetime,Converter,我尝试将字符串转换为日期类型。这就是我所做的一切 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HHMMMDD"); String date = "23Mar25"; System.out.println(date); LocalDate localDate = LocalDate.parse(date, formatter); System.out.println(localDate); 我得到的错误信息是 Te

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

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)
有人能帮我解决吗

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
它使用的模式用于:

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
tl;博士 ……还有

MonthDay.parse( "23Mar25" , DateTimeFormatter.ofPattern ( "HHMMMdd", Locale.US )
        .toString()   // --03-25
细节 如果您确定输入确实代表一天中的一小时、一个月和一个月中的一天

DateTimeFormatter
定义一个
DateTimeFormatter
。确保为人类语言指定一个
区域设置
,用于翻译月份的缩写名称

String input = "23Mar25";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "HHMMMdd", Locale.US );
LocalTime
使用该格式化程序两次。一次生成一天中的某个时间作为保存小时的
LocalTime
对象

LocalTime lt = LocalTime.parse ( input, f );
MonthDay
再次生成一个对象来保存月份和月份的日期

MonthDay md = MonthDay.parse ( input , f  );
ZoneId
为了确定该值的特定时刻,我们必须指定一年和一个时区。如果我们想使用当前年份,我们也需要一个时区。请记住,对于任何给定的时刻,一天中的日期和时间在全球各地都因区域而异

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

LocalDate
通过为我们的
MonthDay
对象指定一年来确定
LocalDate
对象

int yearNumber = Year.now ( z )
                     .getValue ( ) ;
LocalDate ld = md.atYear ( yearNumber );
ZoneDateTime
LocalTime
组合,以获得确切的时刻,即时间线上的一个点。结果是一个对象

转储到控制台

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 );
输入:2005年3月23日

lt:23:00

md:--03-25

劳工处:2017-03-25

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

OffsetDateTime
如果您的输入用于,则在代码中使用与上述类似的常量和类,而不是
ZoneId
zoneDateTime

OffsetDateTime zdt = OffsetDateTime.of ( ld, lt, ZoneOffset.UTC );
ISO 8601 注意输出,
toString
方法生成的字符串。在解析/生成字符串时,java.time类默认使用标准格式。我强烈建议您和您的数据源使用这些标准格式,而不是像在问题中看到的那样发明自己的格式。time类可以直接解析和生成这样的标准字符串,而无需指定格式模式

要生成其他格式的字符串,请使用类。许多其他堆栈溢出页面都涵盖了该主题,因此请搜索许多示例和更多讨论。

tl;博士 ……还有

MonthDay.parse( "23Mar25" , DateTimeFormatter.ofPattern ( "HHMMMdd", Locale.US )
        .toString()   // --03-25
细节 如果您确定输入确实代表一天中的一小时、一个月和一个月中的一天

DateTimeFormatter
定义一个
DateTimeFormatter
。确保为人类语言指定一个
区域设置
,用于翻译月份的缩写名称

String input = "23Mar25";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "HHMMMdd", Locale.US );
LocalTime
使用该格式化程序两次。一次生成一天中的某个时间作为保存小时的
LocalTime
对象

LocalTime lt = LocalTime.parse ( input, f );
MonthDay
再次生成一个对象来保存月份和月份的日期

MonthDay md = MonthDay.parse ( input , f  );
ZoneId
为了确定该值的特定时刻,我们必须指定一年和一个时区。如果我们想使用当前年份,我们也需要一个时区。请记住,对于任何给定的时刻,一天中的日期和时间在全球各地都因区域而异

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

LocalDate
通过为我们的
MonthDay
对象指定一年来确定
LocalDate
对象

int yearNumber = Year.now ( z )
                     .getValue ( ) ;
LocalDate ld = md.atYear ( yearNumber );
ZoneDateTime
LocalTime
组合,以获得确切的时刻,即时间线上的一个点。结果是一个对象

转储到控制台

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 );
输入:2005年3月23日

lt:23:00

md:--03-25

劳工处:2017-03-25

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

OffsetDateTime
如果您的输入用于,则在代码中使用与上述类似的常量和类,而不是
ZoneId
zoneDateTime

OffsetDateTime zdt = OffsetDateTime.of ( ld, lt, ZoneOffset.UTC );
ISO 8601 注意输出,
toString
方法生成的字符串。在解析/生成字符串时,java.time类默认使用标准格式。我强烈建议您和您的数据源使用这些标准格式,而不是像在问题中看到的那样发明自己的格式。time类可以直接解析和生成这样的标准字符串,而无需指定格式模式


要生成其他格式的字符串,请使用类。该主题已被许多其他堆栈溢出页面覆盖,因此请搜索许多示例和更多讨论。

非常感谢,但我需要输出为“3月23日25”,小时+月+日期,任何我可以使用的方法?DD'id表示一年中的某一天。我想你想要的是月日是'dd'。假设你提到了很多,但我需要的输出是“3月25日23日”,小时+月+日期,任何我可以做的方法?'dd'id为一年中的一天。我想您想要的是月日,即“dd”。假设您引用了输入字符串,您确定输入字符串表示小时、月和月日吗?没有年份?您确定输入字符串表示小时、月和月日吗?没有一年?太棒了!这正是我需要的!谢谢!但这里还有一个小问题,我能做什么来获得输出,比如:“3月25日23:00”@WenjieJia我添加了更多内容来显示指定年份和时区以获得准确时刻。非常感谢!它真的很有用!我去