标签: java-time

LocalDate和DateTimeFormatter无法正常使用日语语言环境

在测试我的一些方法时,我遇到了一个奇怪的问题,我似乎已经能够获得我的问题的具体例子.

我使用的ja_JP_JP_#u-ca-japanese语言环境无法使用由语言环境定义的自己的日期模式来解析日期.

我想知道我做错了什么,或者这是否是一个JDK错误.

请注意,为了构造ja_JP_JP_#u-ca-japanese,您需要根据Locale javadoc的new Locale("ja", "JP", "JP")摘录使用:

特别案例

出于兼容性原因,两个不符合要求的语言环境被视为特殊情况.这些是ja_JP_JP和th_TH_TH.这些在BCP 47中是不正确的,因为变体太短.为了便于迁移到BCP 47,这些都在施工期间得到了特殊处理.这两种情况(并且只有这些)导致构造函数生成扩展,所有其他值的行为与Java 7之前完全相同.

Java使用ja_JP_JP代表日本和日本帝国日历一起使用日语.现在可以使用Unicode语言环境扩展来表示,通过指定Unicode语言环境键ca(对于"calendar")并键入japanese.当使用参数"ja","JP","JP"调用Locale构造函数时,会自动添加扩展名"u-ca-japanese".

Java使用th_TH_TH来表示泰国使用的泰语以及泰国数字.现在,使用Unicode语言环境扩展,通过指定Unicode语言环境键nu(用于"数字")和值泰语,也可以表示这一点.当使用参数"th","TH","TH"调用Locale构造函数时,会自动添加扩展名"u-nu-thai".

给出的测试用例演示了这个问题:

@Test
public void testJapaneseLocale() {
    LocalDate specificLocalDate = LocalDate.of(2014, 10, 2);
    Locale jpLocale = new Locale("ja", "JP", "JP");

    DateTimeFormatter jpDateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(jpLocale);
    String jpDate = specificLocalDate.format(jpDateTimeFormatter);

    String jpPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.SHORT, null, Chronology.ofLocale(jpLocale), jpLocale);
    LocalDate jpLocalDate = LocalDate.parse(jpDate, DateTimeFormatter.ofPattern(jpPattern, jpLocale));

    assertEquals(specificLocalDate, jpLocalDate);
}
Run Code Online (Sandbox Code Playgroud)

此代码适用于任何其他常规语言环境,例如英语等.

java locale java-8 java-time

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

如何将java.time.Duration映射到XML

我有一个数据类型的bean:

private java.time.Duration duration
Run Code Online (Sandbox Code Playgroud)

class属性设置如下:

object.setDuration(Duration.ofSeconds(2));
Run Code Online (Sandbox Code Playgroud)

我想将我的对象编组为xml,以便持续时间看起来像那样

<duration>PT2S</duration>
Run Code Online (Sandbox Code Playgroud)

如ISO 8601所定义

据我所知,Jaxb使用默认绑定数据类型,如:

xsd:duration    javax.xml.datatype.Duration
Run Code Online (Sandbox Code Playgroud)

但在我的bean中,我不想包含任何xml依赖项.

我看到编写包装器的可能性,我可以在其中添加XmlAdapter,但我不知道如何将java.time.Duration转换为javax.xml.datatype.Duration

java xml jaxb java-8 java-time

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

如何将时间24小时转换为AM/PM并通过time4j删除纳秒和秒?

我面临的问题是我需要将时间从24格式转换为AM/PM格式(反之亦然),通过time4j库删除冗余值,如纳秒和秒.

我正在使用time4j库,因为Java无法处理Windows时区,我必须通过time4j进行转换

从24小时格式转换为AM/PM将取决于用户本地化.我想把它(本地化)作为一个论点传播.本地化将看起来像"en-US"字符串.

例如:如果用户本地化为"en-US",则将24小时格式转换为AM/PM.否则保持当前价值.

或者,当我已经定义了用户的本地化时,最好是以我需要的格式获得时间?

任何想法如何做到这一点?请帮忙)

我必须花很多时间阅读time4j doc,但我的思绪已被吹嘘

要全面了解我正在做的事情以及所有这一切的目的:

我必须从我的数据库中获取用户timeZone,这对应于Windows时区并将其转换为IANA时区.我已经通过这种方法做到了这一点

WindowsZone wzn = WindowsZone.of(userTimeZoneId); //userTimeZoneId="eg. FLE Standart Time"
TZID winZone = wzn.resolveSmart(new Locale("","001"));
System.out.println(winZone.canonical()); // WINDOWS~Europe/Kiev
Run Code Online (Sandbox Code Playgroud)

其中"userTimeZoneId"是来自DB的timeZone.它对应于Microsoft时区名称

我的下一步是从用户时区获取时间/或时间戳,我已将其转换为IANA时区.

我喜欢这样:

PlainTime currentTime = SystemClock.inZonalView(winZone).now().toTime(); 
//currentTime: "T17:31:37,057"
Run Code Online (Sandbox Code Playgroud)

"winZone"转换时区的地方(例如"WINDOWS~Europe/Kiev")

所以现在回到我在帖子顶部描述的问题.

  1. 当我已经定义了用户的本地化时,最好是以我需要的格式获得时间?

  2. 如何将时间从24格式转换为AM/PM,反之亦然?

  3. 如何删除多余的值,如纳秒和秒?

  4. 如何在转换中使用用户本地化?

java time java-time time4j

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

使用 java.time 查找一年最后一周的第一天

我需要使用 Java 8 日期和时间 API ( java.time )找到一年最后一周的第一天,最后得出了这个解决方案:

LocalDate date = LocalDate.of(2016, 2, 17);
LocalDate lastWeekOfYear = LocalDate.of(date.getYear() + 1, 1, 7)
    .with(WeekFields.ISO.weekOfYear(), 1)
    .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).minusDays(7);
Run Code Online (Sandbox Code Playgroud)

此解决方案查找下一年的第一周,必要时将星期几调整为星期一,然后将 7 天后移。有没有更聪明的方法来达到同样的结果?

java date java-time

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

如何在文本字段中格式化 java.time.LocalDate?

我试图java.time.LocalDate在我的报告中显示以下格式:

<textField pattern="EEEEE dd MMMMM yyyy">
    <reportElement x="64" y="0" width="150" height="20" uuid="5e003c53-2327-4f75-9adf-831a3bb494ff"/>
    <textElement verticalAlignment="Middle">
        <font isBold="true" isUnderline="true"/>
    </textElement>
    <textFieldExpression><![CDATA[$F{dateFacture}]]></textFieldExpression>
</textField>
Run Code Online (Sandbox Code Playgroud)

但我得到的日期如下:2017-03-09。是由于 java.time.LocalDate 类型造成的吗?

java jasper-reports java-time

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

如何使用 LocalDate 查询 LocalDateTime?

我有一个包含 java.time.LocalDateTime 类型的属性的类。

public class MyClass{
    // ...
    private LocalDateTime fecha;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 Spring Data 存储库。我想要完成的是根据日期查询实体:

@Service
public interface IRepository extends CrudRepository<MyClass, UUID> {
    // ...
    public void deleteByFecha(LocalDate fecha);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为抛出异常:

org.springframework.dao.InvalidDataAccessApiUsageException: 参数值 [2016-10-05] 与预期类型 [java.time.LocalDateTime (n/a)] 不匹配;

所以问题是如何通过fecha但使用 LocalDate查询数据库中的 MyClass ?

编辑 以防万一有人面临同样的问题,我想出了一个解决方案:修改存储库的方法,使其看起来如下:

import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
// ...

@Service
public interface IRepository extends CrudRepository<MyClass, UUID> {

    @Transactional
    @Modifying
    @Query("DELETE FROM MyClass mtc WHERE YEAR(mtc.fecha)=?1 AND MONTH(mtc.fecha)=?2 AND DAY(mtc.fecha)=?3")
    public …
Run Code Online (Sandbox Code Playgroud)

java spring spring-data java-time spring-repositories

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

以秒为单位获取当前时间

有没有办法以秒为单位获取当天的当前时间?请注意,我问的是一天中的时间,而不是 UTC 时间。

我想要的是介于0 - 86,400 (12:00AM - 11:59PM)之间的值(以秒为单位)。我正在开发一个每天运行的应用程序,当一天结束时,时间(以秒为单位)应该重新开始0。

所以让我们说它是10:00AM。我应该得到36,000秒,如果我的时间是5:00PM,我应该得到61,200秒。

PS:我不知道手头的时间。该程序将使用currentTime()函数自行计算。

java java-time

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

DateTimeFormatter 不解析自定义日期格式

我有一个关于 java 的问题DataTimeFormmater。我觉得我错过了一些东西,但又不知道到底错过了什么。

String format = "yyyy-MM-dd'T'HH:mm:ss[.S]'T'zxxx";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);

String date = "2017-07-05T12:28:36.4TGMT+03:00";

System.out.println(formatter.format(ZonedDateTime.now()));
System.out.println(formatter.parse(date));
Run Code Online (Sandbox Code Playgroud)

上面的代码生成当前的字符串ZonedDateTime,并尝试使用相同的日期格式化程序解析日期时间字符串。2017-07-05T06:07:51.0TCDT-05:00成功生成但无法解析的结果2017-07-05T12:28:36.4TGMT+03:00

我的目标是解析2017-07-05T12:28:36.4TGMT+03:00并提出适当的DateTimeFormatter.

java datetime datetime-parsing java-time

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

如何使用 EasyMock、没有 Joda Time 和 PowerMock 在 Java 8 Web 应用程序中将当前系统时间覆盖为特定日期?

我需要在 Java 8 中模拟时间(到特定日期,这意味着我可能不会使用anyLong())以java.time在 EasyMock 下的测试环境中单独使用,因此没有 Joda Time。

EasyMock 不允许你模拟像LocalDateTime.now(). PowerMock 可以,但我不允许使用 PowerMock。

Joda Time 库提供了一种简洁优雅的方式来模拟时间DateTimeUtils.setCurrentMillisFixed(),并DateTimeUtils.setCurrentMillisSystem()回到现在的瞬间。

只有我不允许使用 Joda Time。

我被告知使用模拟时钟java.time.Clock类实例并将其注入LocalDateTime.now()如下:LocalDateTime.now(mockClock)

有没有办法在没有 Joda Time和 PowerMock 的情况下正确实现它?

junit easymock junit4 java-8 java-time

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

如何在 Java 中向时间戳添加/减去时区偏移量?

ZonedDateTime我正在使用 JDK 8,并且Timestamp经常使用它。但我仍然无法解决我面临的问题。

假设我得到了TimestampGMT (UTC) 格式的文件,并且我的服务器位于某处。假设它设置为Asia/CalcuttaTimeZone (其 ZoneOffset 为+05:30)。

基本上如何在时间戳中添加/减去我的时区偏移量?

Input : 2017-09-13 13:10:30.333
Output: 2017-09-13 18:40:30.333
Run Code Online (Sandbox Code Playgroud)

解释 :在输入中,时区偏移量 5hrs 30mts 已添加到输入中。此外,输入是 Timestamp 类型,输出也是 Timestamp 类型。

我使用ZoneID.systemDefault()函数来检索 JVM 已知的时区。就我而言,时区结果是Asia/Calcutta.

java timezone datetime timezone-offset java-time

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