标签: java-time

使用java.time基于时区转换时间

如何根据LocalDateTime中的时区更改时间,这里我建立了一个带有时区的日期作为EST,现在我需要找到相应时间的UTC.请帮我解决这个问题

String str = "16Jun2015_153556";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMMyyyy_HHmmss");
formatter.withZone(ZoneId.of("EST5EDT"));
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
Run Code Online (Sandbox Code Playgroud)

java time java-8 java-time

7
推荐指数
2
解决办法
4597
查看次数

比较java.time.ZonedDateTime的实例,忽略Java 8中比较的秒和毫秒时刻

我正在寻找Java 8中Joda Time的等效方法,比较org.joda.time.DateTime(指定时区)的实例,忽略比较中的秒和毫秒,如下所示.

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy hh:mm:ss:SSS a Z").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime first = formatter.parseDateTime("16-Feb-2012 12:03:45:999 AM +05:30");
DateTime second = formatter.parseDateTime("16-Feb-2012 12:03:55:999 AM +05:30");

DateTimeComparator comparator = DateTimeComparator.getInstance(DateTimeFieldType.minuteOfHour());
int compare = comparator.compare(first, second);
System.out.println("compare : " + compare);
Run Code Online (Sandbox Code Playgroud)

比较返回0意味着在忽略比较的秒和毫秒时刻之后,两个对象都被认为是相等的.

DateTimeFieldType此处忽略幅度小于指定的下限的字段.

在Java 8中使用Java Time API执行相同操作的等效方法是什么?

说实话,我尝试用Java 8实现同样的功能.

java java-8 java-time

7
推荐指数
2
解决办法
9553
查看次数

获取一周中给定日期的下一个LocalDateTime

我想LocalDateTime在下一个(例如)星期一的日期/时间创建实例.

Java Time API中是否有任何方法,或者我应该计算当前日期和目标日期之间的天数,然后使用LocalDateTime.of()方法?

java jodatime java-8 java-time

7
推荐指数
1
解决办法
4380
查看次数

Java 8 LocalDateTime ZonedDateTime无法解析带有时区的日期

我试图使用Java 8新的日期模式而不是Joda,我有以下问题:

都

ZonedDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS Z"))
Run Code Online (Sandbox Code Playgroud)

和

LocalDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS Z"))
Run Code Online (Sandbox Code Playgroud)

抛出'java.time.format.DateTimeParseException'异常.而

org.joda.time.DateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormat.forPattern("dd/MM/yy HH:mm.ss.SSS Z"))
Run Code Online (Sandbox Code Playgroud)

工作良好.

异常的原因是:

java.time.format.DateTimeParseException:无法在索引22处解析文本'02/05/16 11:51.12.083 +04:30'

难道我做错了什么?

timezone datetime jodatime java-8 java-time

7
推荐指数
1
解决办法
6974
查看次数

有没有相当于ChronoUnit.between返回分数而不是整数?

这样的方法是ChronoUnit.HOURS.between(start, end)返回long所以我不能从那里得到分数.

是否有一种可以返回分数的替代方法/方法?

java java-8 jsr310 java-time

7
推荐指数
1
解决办法
1600
查看次数

如何在使用Jackson反序列化OffsetDateTime时保留偏移量

在传入的JSON中,我有一个符合ISO8601标准的日期时间字段,包含区域偏移量.我想保留这个偏移量,但不幸的是Jackson在反序列化这个字段时默认为GMT/UTC(我从http://wiki.fasterxml.com/JacksonFAQDateHandling中了解到).

@RunWith(JUnit4.class)
public class JacksonOffsetDateTimeTest {

    private ObjectMapper objectMapper;

    @Before
    public void init() {
        objectMapper = Jackson2ObjectMapperBuilder.json()
            .modules(new JavaTimeModule())
            .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .build();
    }

    @Test
    public void test() throws IOException {
        final String json = "{ \"date\": \"2000-01-01T12:00:00.000-04:00\" }";
        final JsonType instance = objectMapper.readValue(json, JsonType.class);

        assertEquals(ZoneOffset.ofHours(-4), instance.getDate().getOffset());
    }
}


public class JsonType {
    private OffsetDateTime date;

    // getter, setter
}
Run Code Online (Sandbox Code Playgroud)

我在这里得到的是:

java.lang.AssertionError: expected:<-04:00> but was:<Z>
Run Code Online (Sandbox Code Playgroud)

如何使返回的OffsetDateTime包含原始偏移量?

我在Jackson 2.8.3上.

java json jackson java-time

7
推荐指数
1
解决办法
3635
查看次数

DateTimeFormatter接受多个日期并转换为一个日期(java.time库)

我正在尝试编写一个DateTimeFormatter允许我采用多种不同String格式的格式,然后将String格式转换为特定类型.由于项目的范围和已经存在的代码,我不能使用不同类型的格式化程序.

例如,我想接受MM/dd/yyyy以及yyyy-MM-dd'T'HH:mm:ss然后当我打印时我只想打印MM/dd/yyyy格式并在我打电话时将其格式化LocalDate.format(formatter);

有人可以建议如何用这个做到这一点 java.time.format.*;

以下是我可以做到的方式org.joda:

// MM/dd/yyyy format
DateTimeFormatter monthDayYear = DateTimeFormat.forPattern("MM/dd/yyyy");
// array of parsers, with all possible input patterns
DateTimeParser[] parsers = {
        // parser for MM/dd/yyyy format
        monthDayYear.getParser(),
        // parser for yyyy-MM-dd'T'HH:mm:ss format
        DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss").getParser()
};
DateTimeFormatter parser = new DateTimeFormatterBuilder()
    // use the monthDayYear formatter for output (monthDayYear.getPrinter())
    // and parsers array for input (parsers)
    .append(monthDayYear.getPrinter(), parsers)
    // create formatter (using UTC …
Run Code Online (Sandbox Code Playgroud)

java datetime datetime-format datetime-parsing java-time

7
推荐指数
1
解决办法
4559
查看次数

Java:无法从TemporalAccessor获取LocalDate

我试图将String日期的格式从EEEE MMMM d更改MM/d/yyyy为,首先,将其转换为a LocalDate,然后将不同模式的格式化程序应用LocalDate到String再次解析之前.

这是我的代码:

private String convertDate(String stringDate) 
{
    //from EEEE MMMM d -> MM/dd/yyyy

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .append(DateTimeFormatter.ofPattern("EEEE MMMM d"))
            .toFormatter();

    LocalDate parsedDate = LocalDate.parse(stringDate, formatter);
    DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("MM/d/yyyy");

    String formattedStringDate = parsedDate.format(formatter2);

    return formattedStringDate;
}
Run Code Online (Sandbox Code Playgroud)

但是,我得到了这个我不太了解的异常消息:

Exception in thread "main" java.time.format.DateTimeParseException: Text 'TUESDAY JULY 25' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {DayOfWeek=2, MonthOfYear=7, DayOfMonth=25},ISO of type java.time.format.Parsed
    at …
Run Code Online (Sandbox Code Playgroud)

java date-parsing java-time localdate

7
推荐指数
2
解决办法
1万
查看次数

将毫秒级时间戳反序列化为java.time.Instant

我正在尝试使用Jackson读取JSON文件,并以Java的纪元毫秒形式存储其中一个字段Instant,但是反序列化的行为不符合预期。

这是我尝试读取时间戳时看到的内容:

1503115200000

杰克逊将Instant领域设置为+49601-10-28T16:00:00Z。

发生这种情况是因为Jackson的默认设置是使用Instant.ofEpochSecond(Long l)而不是读取时间戳Instant.ofEpochMilli(Long l)。

有没有一种方法可以将Jackson设置ObjectMapper为使用该ofEpochMilli方法呢?这是我目前拥有的ObjectMapper:

ObjectMapper om = new ObjectMapper()
            .registerModule(new JavaTimeModule())
            .configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false)
            .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            .setSerializationInclusion(Include.NON_NULL);
Run Code Online (Sandbox Code Playgroud)

注意

如果我将输入JSON更改为ISO日期(例如)2017-08-19T04:00:00Z或epoch seconds(例如纪元秒),1503115200则Instant字段可以正确设置。

不幸的是JSON输入必须是纪元毫秒,例如1503115200000。

java serialization jackson deserialization java-time

7
推荐指数
4
解决办法
3983
查看次数

如何用java中的两个或三个毫秒数字解析日期时间?

这是我将String解析成的方法LocalDateTime.

    public static String formatDate(final String date) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS");
        LocalDateTime formatDateTime = LocalDateTime.parse(date, formatter);
        return formatDateTime.atZone(ZoneId.of("UTC")).toOffsetDateTime().toString();
    }
Run Code Online (Sandbox Code Playgroud)

但这仅适用于输入字符串, 2017-11-21 18:11:14.05 但无法2017-11-21 18:11:14.057 使用DateTimeParseException.

如何定义适用于.SS和.SSS?的格式化程序?

java datetime-format datetime-parsing java-time dateformatter

7
推荐指数
3
解决办法
2930
查看次数