- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个特定的类可以解析(相当)多种日期:
// imports omitted for brevity
public final class DateParser
{
private static final String DATE_TIME_FORMAT_PATTERN
= "[h][hh][[:][.]mm][[ ]a][ v][ ][[EEEE ][E ][d][dd][/][-][LLLL][L][/][-][uuuu]]";
private static final DateTimeFormatter formatter
= DateTimeFormatter.ofPattern(DATE_TIME_FORMAT_PATTERN).localizedBy(Locale.ENGLISH);
public static ZonedDateTime parseDateTimeString(final String dateTimeString)
{
TemporalAccessor parsedString = formatter.parse(dateTimeString);
ZonedDateTime returnable = ZonedDateTime.now();
// Return a ZonedDateTime with sane defaults if some fields are missing from parsedString
}
}
如果 parsedString 不是完整的 ZonedDateTime
,我想返回一个具有合理默认值的 ZonedDateTime
。
例如,赋予该方法的字符串是“5:45pm”(将成功解析);我希望 ZonedDateTime 反射(reflect)当前时区的今天下午 5:45。当然,如果今天已经过了六点一刻,那么更先发制人的方法是反射(reflect)第二天的下午 5:45,但我想首先实现这一点。
其他可能的输入只是星期几,例如“星期一”
:这将返回设置为当前时间之后的下一个星期一的 ZonedDateTime
当天中午 12 点,本地时间。
仅输入日期“4/2/2020”
将返回在本地时区设置的 ZonedDateTime
,即输入中的日期 ( 2020年2月4日),时间定为中午12点。
我该如何去做呢?我目前有一些代码,仅由很长的 if
链组成:
if (parsedString.isSupported(ChronoField.YEAR))
{
returnable = returnable.withYear(parsedString.get(ChronoField.YEAR));
}
if (parsedString.isSupported(ChronoField.DAY_OF_MONTH))
{
returnable = returnable.withMonth(parsedString.get(ChronoField.MONTH_OF_YEAR));
}
if (parsedString.isSupported(ChronoField.DAY_OF_MONTH))
{
returnable = returnable.withDayOfMonth(parsedString.get(ChronoField.DAY_OF_MONTH));
}
// And so on.
但是,这仅修改当前日期时间组。我不知道如何实现(2)和(3)这样的事情。
此外,是否可以通过以某种方式迭代其字段来从 parsedString
构建 ZonedDateTime
?或者还有其他方法来实现整个解析想法吗?
谢谢大家。
最佳答案
我认为您不能只使用模式来做到这一点,但您可以创建一个 DateTimeFormatterBuilder 并调用它的 parseDefaulting方法:
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
builder.appendPattern(DATE_TIME_FORMAT_PATTERN);
ZonedDateTime defaults = ZonedDateTime.now();
builder.parseDefaulting(ChronoField.YEAR,
defaults.getLong(ChronoField.YEAR));
builder.parseDefaulting(ChronoField.MONTH_OF_YEAR,
defaults.getLong(ChronoField.MONTH_OF_YEAR));
builder.parseDefaulting(ChronoField.DAY_OF_MONTH,
defaults.getLong(ChronoField.DAY_OF_MONTH));
// etc.
DateTimeFormatter formatter = builder.toFormatter();
ZonedDateTime returnable = ZonedDateTime.parse(dateTimeString, formatter);
关于java - 始终从缺少字段的 Java TemporalAccessor 返回 ZonedDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60045914/
我创建了两个 ZonedDateTime 对象,我认为它们应该相等: public static void main(String[] args) { ZoneId zid = ZoneId.
假设我有一个 ZonedDateTime: ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), ZoneI
给定以下单元测试: @Test public void zonedDateTimeCorrectlyRestoresItself() { // construct a new instance
我正在尝试将 ZonedDateTime 与以下代码进行比较: val now = ZonedDateTime.now() val query = for { x Timestamp.from(
我最近迁移到 Java 8,希望能更轻松地处理本地和分区时间。 但是,在我看来,在解析简单日期时,我遇到了一个简单的问题。 public static ZonedDateTime convertirA
您好,我已经搜索过类似的问题,但没有成功。我正在调用一个 ws,它将一个 token 发回给我,当它是有效的示例时: { "token": ..., "notBefore":"Thu 21
我有一个 ZonedDateTime 对象,我想根据给定的区域设置对其进行格式化。 IE。在美国,我希望格式为“M-dd-yy”,但在英国则应为“dd-M-yy”。 在给定的语言环境下执行此操作的最佳
在比较 ZonedDateTimes 时,使用 和 == 并不总是与使用 .isBefore、.isAfter 和 isEqual 相同,如下面的 Kotlin 示例所示: import java.
我有以下功能 public String getDateAndTimeInUserFormat(String value, DateTimeFormat inputFormat) { retu
我的时间以毫秒为单位,我需要将其转换为 ZonedDateTime 对象。 我有以下代码 long m = System.currentTimeMillis(); LocalDateTime d =
我尝试将字符串转换为 ZonedDateTime。这是我的代码: String startTime = "Wed Mar 21 2018 08:00:00 GMT 0330 (IRST)"; Stri
在比较 ZonedDateTimes 时,使用 和 == 并不总是与使用 .isBefore、.isAfter 和 isEqual 相同,如下面的 Kotlin 示例所示: import java.
我正在尝试获取存储为 UTC 的日期时间并将其转换为给定时区的日期时间。据我所知,ZonedDateTime 是正确的(“美国/芝加哥”比 UTC 晚 5 小时),但 DateTimeFormatte
我需要将字符串 2020-04-15T23:00:00+0000 转换为 ZonedDateTime。我尝试了以下方法,但没有成功: DateTimeFormatter formatter = Dat
如何将已设置的 ZonedDateTime 时间更改为“java.time.LocalTime.MIN”或“java.time.LocalTime.MAX”? ZonedDateTime date =
我正在尝试将字符串转换为 ZonedDateTime。 我尝试过以下操作: SimpleDateFormat zonedDateTimeFormat = new SimpleDateFormat("y
我目前正在研究日期在英国夏令时间之内和之外时的 ZonedDateTime 行为。 英国夏令时间从 3 月 25 日开始,增加一小时 (+1)。 我创建了几个 ZonedDateTime 实例(UTC
ZonedDateTime zdt3 = ZonedDateTime.parse("1999-09-09 09:09:09.999", DateTimeFormatter.of
我有一个返回年、月、日和小时的 DTO。因此将值从 DTO 传递到 ZonedDateTime.of 方法。此处,时间显示为太平洋标准时间上午 10 点。因此,尝试将其转换为 UTC。 当传递月份为
String ip="2011-05-01T06:47:35.422-05:00"; ZonedDateTime mzt = ZonedDateTime.parse(ip).toInstant().a
我是一名优秀的程序员,十分优秀!