标签: java-time

如何在Joda Time/Java 8中列出时区偏移量,时区ID和长名称?

Joda Time的时区ID可以使用以下代码段显示.

Set<String> zoneIds = DateTimeZone.getAvailableIDs();

for(String zoneId:zoneIds) {
    System.out.println(zoneId);
}
Run Code Online (Sandbox Code Playgroud)

但是如何显示相应的时区偏移量,时区ID和长名称,以便列表看起来如下所示?

(GMT-10:00) Pacific/Honolulu, Hawaii Standard Time
(GMT-10:00) Pacific/Johnston, Hawaii Standard Time
(GMT-10:00) Pacific/Fakaofo, Tokelau Time
(GMT-10:00) HST, Hawaii Standard Time
Run Code Online (Sandbox Code Playgroud)

需要将它们列在下拉框中以供选择.


以下代码段显示了名称,但显示的偏移看起来很糟糕.

Set<String> zoneIds = DateTimeZone.getAvailableIDs();

for (String zoneId : zoneIds) {
    int offset = DateTimeZone.forID(zoneId).getOffset(new DateTime());
    String longName = TimeZone.getTimeZone(zoneId).getDisplayName();

    System.out.println("(" + offset + ") " + zoneId + ", " + longName);
}
Run Code Online (Sandbox Code Playgroud)

在它显示的长列表中,其中一些显示为,

(-36000000) Pacific/Honolulu, Hawaii Standard Time
(-36000000) Pacific/Johnston, Hawaii Standard Time
(-36000000) Pacific/Fakaofo, Tokelau …
Run Code Online (Sandbox Code Playgroud)

java timezone jodatime java-8 java-time

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

Java 8中的新日期和时间API

在这个页面上我读了以下内容:

要使用日期进行计算,这也很容易.与目前Java <1.8的情况相比,可能是最好的改进:

Period p = Period.of(2, HOURS);
LocalTime time = LocalTime.now();
LocalTime newTime = time.plus(p); // or time.plus(5, HOURS); or time.plusHours(5); 
Run Code Online (Sandbox Code Playgroud)

我没有清楚地看到版本<1.8之前的优势.

也许有人可以举个例子?Atm我问自己,新的日期和时间API的改进来自哪里.

java datetime java-8 java-time

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

如何让Wildfly使用其他Jackson数据类型?

我收到了这个错误

03:33:14,938 WARN  [org.jboss.resteasy.core.ExceptionHandler] (default task-1) Failed executing PUT /individual/5a247ce9-0a73-4373-89ce-e4177f911259/activities/432e6e5b-4185-462f-b57e-9ec04bec3d58: org.jboss.resteasy.spi.ReaderException: org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [simple type, class java.time.Instant] from JSON String; no single-String constructor/factory method (through reference chain: com.lm.activity.DTOActivity["created"])
Run Code Online (Sandbox Code Playgroud)

这是因为Wildfly不知道如何处理瞬间.通过阅读错误,我可以简单地在该类中处理它,但这看起来很愚蠢.我正在使用以下库,并在我的war文件中发送它和所有更新的jackson ,但仅此一点并没有这样做.

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.3.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.3.2</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>2.3.2</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

我找到了这个wiki

但我的实现有问题,类定义语句有错误

package com.lm.infrastructure;

import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

@Provider
@Produces( MediaType.APPLICATION_JSON )
public class JacksonProducer implements ContextResolver<ObjectMapper> …
Run Code Online (Sandbox Code Playgroud)

java jackson wildfly java-time

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

在Java中解析日期时间字符串需要"Locale"吗?

  • 在什么条件下我需要Locale在Java中解析日期时间字符串?
  • Locale与时区有什么关系?

有时我会看到问题与解答,解决问题的解决方案需要Locale.然而在其他人中却没有提到Locale.

java datetime date java-time

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

使用DateTimeFormatter显示短时区名称

我有以下内容DateTimeFormatter.

DateTimeFormatter DATE_TIME_FORMATTER = 
    DateTimeFormatter.ofPattern("MM/dd/yyyy 'at' hh:mm:ss a zzzz");
Run Code Online (Sandbox Code Playgroud)

我用它来格式化ZonedDateTime这样:

ZonedDateTime disableTime = Instant.now()
        .plus(Duration.ofDays(21))
        .atZone(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(-5)));
System.out.println(DATE_TIME_FORMATTER.format(disableTime));
Run Code Online (Sandbox Code Playgroud)

我希望这能输出格式化的日期字符串,如下所示:

2015年9月16日美国东部时间下午01:15:45

但是获得输出的是:

2015年9月16日下午01:15:45 UTC-05:00

无论我是否使用z,zz,zzz,或zzzz在模式,它总是在得到上面的格式输出.

是否有不同的方式来创建ZonedDateTime将给我所需的输出,或者我在模式中做错了什么?

根据DateTimeFormatter 文档,O应该用于显示本地化的区域偏移量,例如UTC-05:00,z应该用于显示时区名称,例如Eastern Daylight Time,或EDT.

java java-8 java-time

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

Java 8时间包的Spring批量序列化问题

我有一个Spring批处理应用程序,它在JobExecutionContext中存储了几个Java 8时间对象.我正在使用JobRespository的默认序列化程序.在解析出正在写入BATCH_STEP_EXECUTION_CONTEXT表的数据时,我遇到异常.我有一个LocalDateTime存储为:

{
    "@resolves-to": "java.time.Ser",
    "byte": [5,
    8,
    18,
    8,
    45,
    50],
    "int": [2015,
    10000000]
}
Run Code Online (Sandbox Code Playgroud)

当我尝试从以前的JobExecution数据中读取时,这会导致异常:

Caused by: java.lang.ClassCastException: java.lang.Byte cannot be cast to java.lang.Integer
at com.thoughtworks.xstream.core.util.CustomObjectInputStream.readInt(CustomObjectInputStream.java:144) ~[xstream-1.4.8.jar:1.4.8]
at java.time.LocalDate.readExternal(LocalDate.java:2070) ~[na:1.8.0_45]
at java.time.LocalDateTime.readExternal(LocalDateTime.java:2002) ~[na:1.8.0_45]
at java.time.Ser.readInternal(Ser.java:259) ~[na:1.8.0_45]
at java.time.Ser.readExternal(Ser.java:246) ~[na:1.8.0_45]
at com.thoughtworks.xstream.converters.reflection.ExternalizableConverter.unmarshal(ExternalizableConverter.java:167) ~[xstream-1.4.8.jar:1.4.8]
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) ~[xstream-1.4.8.jar:na]
... 97 common frames omitted
Run Code Online (Sandbox Code Playgroud)

我正在使用Spring-batch 3.0.5.RELEASE.我也尝试升级到最新版本的xstream(1.4.8)和Jettison(1.3.7),但我得到了同样的例外.

这似乎是XStream(链接)的已知问题.建议是在XStream中注册自定义转换器.但是,spring-batch不会公开实际的XStream对象以注册转换器.有关如何进行的任何建议?

java spring xstream spring-batch java-time

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

java.time:日期"20150901023302166"的DateTimeParseException

LocalDateTime.parse("20150901023302166", DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"))
Run Code Online (Sandbox Code Playgroud)

给出错误:

java.time.format.DateTimeParseException:无法在索引0处解析文本'20150901023302166'

java java-8 java-time

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

为什么`GMT + 8`无法用模式`O`解析,尽管直接从doc中复制?

为什么以下命令无法运行,日期时间字符串无法解析为OffsetDateTime?

String inputOdt = "2016-01-23T12:34:56 GMT+8";
DateTimeFormatter formatterOdt = DateTimeFormatter.ofPattern ( "yyyy-MM-dd'T'HH:mm:ss O" );
OffsetDateTime odt = OffsetDateTime.parse ( inputOdt , formatterOdt );
Run Code Online (Sandbox Code Playgroud)

使用Java(TM) SE Runtime Environment (build 1.8.0_92-b14)Mac OS X上埃尔卡皮坦10.11.4.

生成错误:

线程"main"中的异常java.time.format.DateTimeParseException:无法解析文本'2016-01-23T12:34:56 GMT + 8':字符串索引超出范围:25

所述偏移从-UTC串GMT+8从类文件在例如复制粘贴DateTimeFormatter.报价:

偏移O:根据模式字母的数量格式化本地化偏移.一个字母输出本地化偏移的缩写形式,即局部偏移文本,例如'GMT',小时不带前导零,可选2位数分钟,第二个非零,和冒号,例如'GMT + 8 ".


字符串的其余部分成功解析为LocalDateTime.所以问题似乎确实是从UTC部分偏移.

String inputLdt = "2016-01-23T12:34:56";
DateTimeFormatter formatterLdt = DateTimeFormatter.ofPattern ( "yyyy-MM-dd'T'HH:mm:ss" );
LocalDateTime ldt = LocalDateTime.parse ( inputLdt , formatterLdt );

System.out.println ( "" );
System.out.println ( …
Run Code Online (Sandbox Code Playgroud)

java datetime java-time

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

具有指定parseDefaulting的DateTimeFormatterBuilder与YEAR字段冲突

我有以下格式化程序:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("yyyyMM")
        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
        .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
        .parseDefaulting(ChronoField.YEAR, ZonedDateTime.now().getYear())
        .toFormatter()
        .withZone(ZoneId.systemDefault());
Run Code Online (Sandbox Code Playgroud)

我试着解析字符串"201505"

System.out.println(ZonedDateTime.parse("201505", formatter));
Run Code Online (Sandbox Code Playgroud)

它会引发异常:

引起:java.time.DateTimeException:发现冲突:2016年与2015年不同

如果我注释掉YEAR的默认值设置,它会起作用.

据我所知,如果没有解析值,它应该只尝试替换默认值.这似乎适用于月份,因为我的月份与解析的默认月份不同.但它不适用于一年.

我使用它错了可能有人告诉我是否有不同的方法来定义模式中可能不存在的字段的默认值?

java datetime java-8 java-time

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

按日期对项目进行分组

我的列表中有项目,项目有一个字段,显示项目的创建日期.

在此输入图像描述

我需要根据用户提供的"压缩"对它们进行分组.选项包括Day,Week,Month和Year.

如果用户选择day压缩,我需要将我的项目分组,以便在同一天创建的项目将被分组.在上面的示例中,仅在同一天创建了第1项和第2项.其他人也是团体,但他们只有一个项目,因为在他们的日子,只创建了一个项目.

{{item1, item2}, {item3}, {item4}, {item5}, {item6}, {item7}}
Run Code Online (Sandbox Code Playgroud)

如果用户选择week:

{{item1, item2, item3, item4}, {item5}, {item6}, {item7}}
Run Code Online (Sandbox Code Playgroud)

如果用户选择month:

{{item1, item2, item3, item4, item5}, {item6}, {item7}}
Run Code Online (Sandbox Code Playgroud)

如果用户选择year:

{{item1, item2, item3, item4, item5, item6}, {item7}}
Run Code Online (Sandbox Code Playgroud)

创建组后,项目的日期并不重要.我的意思是,只要创建了组,密钥就可以是任何东西.

在使用的情况下Map,我认为按键如下:

day=一年中的一天=一年中的
week一周=一年中的
month一个月
year=一年

什么是这个问题的最佳解决方案?我甚至无法启动它,除了迭代之外我无法想到解决方案.

java java-8 java-stream java-time

10
推荐指数
2
解决办法
9701
查看次数