小编pan*_*adb的帖子

与Java时间混淆解析UTC

我对java时间的时间处理感到困惑.我长期以来一直在假设如果将时间戳指定为祖鲁时间,那么java会处理与本地时间有关的偏移量.

为了显示.我目前在BST,其偏移量为UTC +1.考虑到这一点,我希望这个祖鲁时间:

2016-09-12T13:15:17.309Z
Run Code Online (Sandbox Code Playgroud)

成为

2016-09-12T14:15:17.309 
Run Code Online (Sandbox Code Playgroud)

解析后的LocalDateTime.这是因为我的默认系统时间设置为BST,上述时间戳(祖鲁时间)指定它是UTC时间.

相反,请考虑以下示例:

        String ts = "2016-09-12T13:15:17.309Z";
        LocalDateTime parse = LocalDateTime.parse(ts, DateTimeFormatter.ISO_DATE_TIME);
        System.out.println(parse);
Run Code Online (Sandbox Code Playgroud)

这将打印:

2016-09-12T13:15:17.309
Run Code Online (Sandbox Code Playgroud)

因此,解析为LocalDateTime的时间戳不会被识别为UTC时间,而是直接将其视为本地时间.所以我想,也许我需要将它解析为ZonedDateTime并专门将其转换为LocalDateTime以获得正确的本地时间.通过这个测试:

        String ts = "2016-09-12T13:15:17.309Z";
        ZonedDateTime parse = ZonedDateTime.parse(ts, DateTimeFormatter.ISO_DATE_TIME);
        System.out.println(parse);
        System.out.println(parse.toLocalDateTime());
Run Code Online (Sandbox Code Playgroud)

我得到了输出:

2016-09-12T13:15:17.309Z
2016-09-12T13:15:17.309
Run Code Online (Sandbox Code Playgroud)

两个日期的输出相同.

正确解析我能找到的唯一方法是:

    String ts = "2016-09-12T13:15:17.309Z";
    Instant instant = Instant.parse(ts); // parses UTC
    LocalDateTime ofInstant = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    System.out.println(instant);
    System.out.println(ofInstant);
Run Code Online (Sandbox Code Playgroud)

这打印:

2016-09-12T13:15:17.309Z
2016-09-12T14:15:17.309
Run Code Online (Sandbox Code Playgroud)

哪个是对的.

所以问题是:

  • java时间不应该识别UTC时间戳并将其解析为正确的系统默认值吗?
  • 如何使用该LocalDateTime#parse方法获得正确的结果?
  • Instant现在应该使用所有内容并丢弃解析吗?

问题是jersey/jacksonjava时间模块使用ISO格式和常规LocalDateTime#parse方法解析时间戳.我意识到我的时代已经没有了,因为他们正在接受治疗LocalTime,事实上他们在祖鲁时代.

java datetime parsing localtime java-time

9
推荐指数
2
解决办法
5340
查看次数

JDBC何时进行自动提交提交

我正在努力减少死锁,并向我指出,我不应该对一个连接使用多个查询,因为事务可能未提交和打开,从而导致死锁.所以在伪代码中,这样的事情:

try(Connection con = datasource.getConnection()) 
    {
        PreparedStatement stm1 = con.prepareStatement(getSQL());
        stm1.setString(1, owner);
        stm1.setTimestamp(2, Timestamp.valueOf(LocalDateTime.now()));
        stm1.setInt(3, count);

        int updateCount = stm1.executeUpdate();
        stm1.close();


        PreparedStatement stm2 = con.prepareStatement(getSQL2());
        stm2.setString(1, owner);
        ResultSet rs = stm2.executeQuery();

        List<Object> results = new ArrayList<>();
        while(rs.next()) {
            results.add(create(rs));
        }

        return results;
    } catch (SQLException e) {
        throw new RuntimeException("Failed to claim message",e);
    }
Run Code Online (Sandbox Code Playgroud)

当auto-commit设置为true时,stm1何时提交事务?

重用这样的连接或两个语句是否都使用单独的连接是一种好的做法吗?

java sql jdbc sql-server-2012

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

Gradle为同一个项目设置多个构建脚本

对于我的项目,我有不同的设置,需要将某个第三方库添加到类路径中.基于关键字,我需要将A.jar或B.jar添加到项目的类路径中.

我已经知道我可以使用-bflag来指定不同的构建脚本.但是我不知道如何告诉gradle项目的基本路径是一级的.所以,说这个配置:

/src/main/java
/build_scripts/buildA.gradle
              /buildB.gradle
Run Code Online (Sandbox Code Playgroud)

现在,如果我执行gradle -b build_scripts/buildA.gradle它做了正确的事情,但是所有生成的文件都被路由到build_scripts.

  1. 所以我想知道,在执行不同的脚本文件时,我可以更改gradle的根目录吗?

  2. 这是添加额外依赖项的正确方法吗?我试图避免在我的构建文件中执行if-else语句.我也可以只导入一个只定义依赖项的部分构建文件(如果可能)?

java gradle build.gradle

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