java西语_使用Java 8 DateTimeFormatter和西班牙语月份名称进行解析

本文讨论了如何使用Java 8的DateTimeFormatter处理西班牙语月份名称,包括创建不区分大小写的格式器,解析YearMonth对象,并设置默认值以处理缺失的日期和时间字段。还提到了与SimpleDateFormat的差异以及如何转换为java.util.Date。
摘要由CSDN通过智能技术生成

可以删除对ofLocalizedDateTime()的调用,因为最后你调用ofPattern(),创建另一个格式不同的格式化程序(由ofLocalizedDateTime(FormatStyle.FULL)返回的模式与月份非常不同,所以这是不是你真正想要的).

另一个细节是Mayo是完整的月份名称,因此模式必须是MMMM(check the javadoc以获取更多详细信息).此外,默认情况下,DateTimeFormatter仅接受小写名称(至少在我使用西班牙语语言环境进行的测试中),因此您必须将格式化程序设置为不区分大小写.

您可以使用java.time.format.DateTimeFormatterBuilder来实现:

DateTimeFormatter fmt = new DateTimeFormatterBuilder()

// case insensitive

.parseCaseInsensitive()

// pattern with full month name (MMMM)

.appendPattern("MMMM yyyy")

// set locale

.toFormatter(new Locale("es", "ES"));

// now it works

fmt.parse("Mayo 2017");

或者,您可以直接将其解析为java.time.YearMonth对象,因为它似乎是这种情况的最佳选择(因为输入只有年和月):

YearMonth ym = YearMonth.parse("Mayo 2017", fmt);

System.out.println(ym); // 2017-05

默认值

当输入没有所有字段时,SimpleDateFormat只是为它们使用一些默认值.在这种情况下,输入只有年和月,因此解析的日期将等于解析的月/年,但是日期将设置为1,时间将设置为午夜(在JVM默认时区).

新API对此非常严格,除非您告诉它,否则不会创建默认值.配置它的一种方法是使用parseDefaulting和java.time.temporal.ChronoField:

DateTimeFormatter fmt = new DateTimeFormatterBuilder()

// case insensitive

.parseCaseInsensitive()

// pattern with full month name (MMMM)

.appendPattern("MMMM yyyy")

// default value for day of month

.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)

// default value for hour

.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)

// default value for minute

.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)

// set locale

.toFormatter(new Locale("es", "ES"));

这样,您可以将其解析为LocalDateTime,并将缺少的字段分配给相应的默认值:

LocalDateTime dt = LocalDateTime.parse("Mayo 2017", fmt);

System.out.println(dt); // 2017-05-01T00:00

如果需要获取与SimpleDateFormat创建的值相同的java.util.Date,可以将此LocalDateTime转换为JVM默认时区,然后将其转换为Date:

Date javaUtilDate = Date.from(dt.atZone(ZoneId.systemDefault()).toInstant());

请注意,我必须明确使用JVM默认时区(ZoneId.systemDefault()),这是SimpleDateFormat所使用的.

另一种方法是手动设置YearMonth值中的值:

// in this case, the formatter doesn't need the default values

YearMonth ym = YearMonth.parse("Mayo 2017", fmt);

ZonedDateTime z = ym

// set day of month to 1

.atDay(1)

// midnight at JVM default timezone

.atStartOfDay(ZoneId.systemDefault());

Date javaUtilDate = date.from(z.toInstant());

API使用IANA timezones names(总是采用Region / City格式,如America / New_York或Europe / Berlin),因此您可以调用ZoneId.of(“America / New_York”).

避免使用3个字母的缩写(如CST或PST),因为它们是ambiguous and not standard.

您可以通过调用ZoneId.getAvailableZoneIds()获取可用时区列表(并选择最适合您系统的时区).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值