【问题标题】:how to convert string to date (HHMMMDD) (hour, month, day-of-month)如何将字符串转换为日期(HHMMMDD)(小时、月、日)
【发布时间】:2017-08-26 08:45:09
【问题描述】:

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

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)

谁能帮我解决?

【问题讨论】:

  • 您确定输入字符串表示小时、月份和日期吗?没有年份?

标签: java string date datetime converter


【解决方案1】:

tl;博士

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 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

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 );

输入:23Mar25

时间:23:00

md: --03-25

日期: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 页面都涵盖了该主题,因此请搜索许多示例和更多讨论。

【讨论】:

  • 太棒了!这正是我需要的!非常感谢!但是这里还有一个小问题,我可以采取任何方法来获得输出,例如:“23:00 Mar 25”?
  • @WenjieJia 我添加了更多内容以显示指定年份和时区以获得准确的时刻。
  • 非常感谢!真的很有用!我明白了,太棒了!
  • @WenjieJia 请回答我之前在您的问题上留下的评论。编辑您的问题,以明确表示传入的字符串确实代表一天中的一个小时、一个月的名称和一个月的一天,但没有年份。您的格式不寻常且令人困惑。
【解决方案2】:
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

【讨论】:

  • 非常感谢,但我需要输出为“25 年 3 月 23 日”,小时 + 月 + 日期,有什么方法可以吗?
  • 'DD' id 表示一年中的某一天。我想您想要“dd”的月份。假设您参考joda.org/joda-time/key_format.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多