标签: java-time

Java 8 DateTimeFormatter解析不同重要性的可选小数秒

我的MCVE(作为TestNG单元测试):

public class MyDateTimeFormatterTest {

    private static final String BASE_PATTERN = "yyyy/MM/dd HH:mm:ss";
    private static final DateTimeFormatter FORMATTER =
            DateTimeFormatter.ofPattern(BASE_PATTERN + "[.SSSSSSSSS]");
    private static final LocalDateTime TEST_INPUT =
            LocalDateTime.of(2015, 5, 4, 12, 34, 56, 123456789);

    @DataProvider(name = "test-cases")
    public Iterator<Object[]> getTestCases() {
        return Arrays.asList(testFor("", ChronoUnit.SECONDS),
                testFor(".SSS", ChronoUnit.MILLIS),
                testFor(".SSSSSS", ChronoUnit.MICROS),
                testFor(".SSSSSSSSS", ChronoUnit.NANOS)).iterator();
    }

    @Test(dataProvider = "test-cases")
    public void testWithDefaultResolution(String input, LocalDateTime output) {
        assertThat(FORMATTER.parse(input, LocalDateTime::from), equalTo(output));
    }

    private Object[] testFor(String patternSuffix, TemporalUnit truncatedTo) {
        return new Object[] …
Run Code Online (Sandbox Code Playgroud)

java datetime-parsing java-time

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

Java 8 - 将LocalDate转换为ZonedDateTime

我是java.time包的新手.我有一个LocalDate 2015-12-10.我需要将其转换为ZonedDateTime.时间应为00:00:00,区域为ZoneOffset.UTC.

转换后,ZonedDateTime应为2015-12-10T00:00:00 + 02:00.

我将LocalDate存储在名为startDate的变量中.

我试过了:

ZonedDateTime.ofInstant(Instant.from(startDate), ZoneOffset.UTC)
Run Code Online (Sandbox Code Playgroud)

但得到错误

java.time.DateTimeException:无法从TemporalAccessor获取Instant:2015-12-10,类型为java.time.LocalDate]

我也尝试过:

startDate.atStartOfDay().atZone(ZoneOffset.UTC)
Run Code Online (Sandbox Code Playgroud)

这给出了意外的结果.

我查看了API并尝试了其他一些方法,但到目前为止还没有运气.

有没有其他方法可以将LocalDate转换为ZonedDateTime?

java java-8 java-time

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

JSR 310 :: System.currentTimeMillis()vs Instant.toEpochMilli():: TimeZone

您能否详细说明如何获得默认系统时区和给定时区的正确纪元时间(以毫秒为单位).

特定

1. TimeZone:GMT + 3

2.以下代码段:

import java.time.*;

public class Main {        
    public static void main(String[] args) {
        System.out.println(LocalDateTime
            .now()
            .atZone(ZoneOffset.UTC)
            .toInstant()
            .toEpochMilli()
        );
        System.out.println(LocalDateTime
            .now()
            .atZone(ZoneOffset.of("+3"))
            .toInstant()
            .toEpochMilli()
        );
        System.out.println(System.currentTimeMillis());
    }
}
Run Code Online (Sandbox Code Playgroud)

3.输出:

1444158955508
1444148155508
1444148155508
Run Code Online (Sandbox Code Playgroud)

4.用于System.currentTimeMillis()的 JavaDoc,它告诉返回的值将是当前时间与1970年1月1日UTC午夜之间的差值(以毫秒为单位).

所以为什么

  1. LocalDateTimeat 的输出GMT+3是相同的System.currentTimeMillis(),虽然System.currentTimeMillis()提到的文件UTC?
  2. LocalDateTimeat 的输出UTC不同System.currentTimeMillis(),虽然System.currentTimeMillis()提到的文件UTC?

java timezone datetime java-8 java-time

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

如何使用objectMapper设置java.time.Instant的字符串格式?

我有一个java.time.Instant创建数据字段的实体:

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class Item {
    private String id;
    private String url;
    private Instant createdDate;
}
Run Code Online (Sandbox Code Playgroud)

我com.fasterxml.jackson.databind.ObjectMapper用来将项目保存为Elasticsearch作为JSON:

bulkRequestBody.append(objectMapper.writeValueAsString(item));
Run Code Online (Sandbox Code Playgroud)

ObjectMapper 将此字段序列化为对象:

"createdDate": {
    "epochSecond": 1502643595,
    "nano": 466000000
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试注释,@JsonFormat(shape = JsonFormat.Shape.STRING)但它对我不起作用.

我的问题是如何将此字段序列化为2010-05-30 22:15:52字符串?

java jackson java-8 java-time objectmapper

19
推荐指数
3
解决办法
2万
查看次数

从ResultSet获取日期以与java.time类一起使用

反正有没有得到一个java.time(Java 8中新的)兼容时间类ResultSet?

我知道你可以使用ResultSet's getDate或者getTimestamp这些方法返回java.sql.Date/ java.sql.Timestamp对象现在已被弃用,所以使用它们来创建一个ZonedDateTime或类似的似乎是不好的做法.

resultset getdate java-8 java-time

18
推荐指数
3
解决办法
1万
查看次数

Java8为LocalDateTime添加时间不起作用

我尝试过如下,但在两种情况下它都显示同一时间?我做错了什么.

    LocalDateTime currentTime = LocalDateTime.now(ZoneId.of("UTC"));
    Instant instant = currentTime.toInstant(ZoneOffset.UTC);
    Date currentDate = Date.from(instant);
    System.out.println("Current Date = " + currentDate);
    currentTime.plusHours(12);
    Instant instant2 = currentTime.toInstant(ZoneOffset.UTC);
    Date expiryDate = Date.from(instant2);
    System.out.println("After 12 Hours = " + expiryDate);
Run Code Online (Sandbox Code Playgroud)

"当前日期"时间与"12小时后"相同...

java-8 java-time

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

Android N Java8 java.time

我更新到最新的Android N sdk.我唯一不理解的是为什么我无法导入java.time我的代码?我认为Java8可以通过Android N获得.那么为什么谷歌没有添加java.time包?

android java-8 java-time android-7.0-nougat

18
推荐指数
4
解决办法
7326
查看次数

java.time.Duration中的错误

我需要从字符串中解析持续时间.Java 8提供了一种以ISO-8601标准为基础的方法:

Duration.parse("p10d"); // parses as ten days
Duration.parse("pt1h"); // parses as one hour
Run Code Online (Sandbox Code Playgroud)

由于标准规定"允许通过共同协议省略'T'字符",持续时间的一些Javadoc示例中的一些例子都没有T.据他们说,以下表达式应解析为"-6小时+3分钟":

"P-6H3M"
Run Code Online (Sandbox Code Playgroud)

但是我发现所有的表达都省略了T抛出a DateTimeParseException.这是方法中的错误parse()还是我遗漏了什么?

java java-8 java-time

17
推荐指数
2
解决办法
1720
查看次数

将"duration""Unit"转换为毫秒

我希望有一个看起来像的API

public static long toMillis ( long duration, ChronoUnit unit ) {
   // magic duration to millis
}

toMillis( 5, ChronoUnit.SECONDS); // 5000
Run Code Online (Sandbox Code Playgroud)

当然,我实际上并没有写作,toMillis但这基本上就是我想要做的.

java java-time

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

将java.util.Date转换为yyyy-MM-dd格式的String,而不创建大量对象

我需要转换java.util.Date到String的yyyy-MM-dd格式在一个大的数额.

我刚刚转到java 8并想知道如何正确地做到这一点.我使用Java 7的解决方案如下:

DateTimeFormatter DATE_FORMATTER = DateTimeFormat.forPattern(DATE_FORMAT_PATTERN)

DATE_FORMATTER.print(value.getTime())
Run Code Online (Sandbox Code Playgroud)

它帮助我不创建大量冗余对象.

所以现在当我转到java 8时,我想要正确地重写它,但是:

LocalDate.fromDateFields(value).toString())
Run Code Online (Sandbox Code Playgroud)

每次都创建新LocalDate对象,这为GC提供了大量的工作.

有什么方法可以解决我的问题吗?性能和线程安全非常重要.

经过一些测试后,我发现即使创建新的对象构造:

new SimpleDateFormat("yyyy-MM-dd")).format(value)) 
Run Code Online (Sandbox Code Playgroud)

这个话题最快.

java java-8 java-time

17
推荐指数
1
解决办法
4014
查看次数