标签: 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
查看次数

如何创建不使用冒号的ISO_INSTANT DateTimeFormatter的自定义变体?

我想将类的实例转换java.time.Instant为Strings和来自Strings.

我想使用一种格式,就像格式java.time.format.DateTimeFormatter.ISO_INSTANT中的冒号被省略或用点代替的唯一区别一样,这样它们就可以在不转义文件名和URL的情况下使用.

示例:2011-12-03T10.15.30.001Z而不是2011-12-03T10:15:30.001Z

有关ISO_INSTANT的信息,请参阅Javadoc:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_INSTANT

java java-8 java-time

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

这是从日期获取UTC的java.sql.Timestamp的正确方法吗?

我开发了一个SonarQube插件,为了满足我的一个需求,我需要将项目的分析日期存储为SQL TIMESTAMP(请注意: a TIMESTAMP,而不是 a TIMESTAMP WITH TIMEZONE).

以下是我目前的工作方式:

// In the SonarQube Sensor
// .getAnalysisDate() returns a java.util.Date
final Instant instant = module.getAnalysisDate().toInstant();

// Timestamp at UTC from the Instant
final LocalDateTime dt = LocalDateTime.frominstant(instant, ZoneOffset.UTC);
final Timestampt ts = Timestamp.valueOf(dt);
Run Code Online (Sandbox Code Playgroud)

抓住Instant的概念我有点麻烦,还有ZonedDateTime等......

无论如何,这似乎做我想要的,但这是正确的方法吗?

java java-8 java-time

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

Java 8:如何解析借记卡的到期日期?

使用Joda时间解析借记卡/信用卡的到期日期非常容易:

org.joda.time.format.DateTimeFormatter dateTimeFormatter = org.joda.time.format.DateTimeFormat.forPattern("MMyy").withZone(DateTimeZone.forID("UTC"));
org.joda.time.DateTime jodaDateTime = dateTimeFormatter.parseDateTime("0216");
System.out.println(jodaDateTime);
Run Code Online (Sandbox Code Playgroud)

日期: 2016-02-01T00:00:00.000Z

我尝试使用Java Time API做同样的事情:

java.time.format.DateTimeFormatter formatter = java.time.format.DateTimeFormatter.ofPattern("MMyy").withZone(ZoneId.of("UTC"));
java.time.LocalDate localDate = java.time.LocalDate.parse("0216", formatter);
System.out.println(localDate);
Run Code Online (Sandbox Code Playgroud)

输出:

引起:java.time.DateTimeException:无法从TemporalAccessor获取LocalDate:{MonthOfYear = 2,Year = 2016},ISO,UTC,类型为java.time.format.Parsed,类型为java.time.LocalDate.from(LocalDate.java :368)java.time.format.Parsed.query(Parsed.java:226)at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)... 30 more

我犯了什么错误以及如何解决它?

java jodatime java-8 java-time

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

LocalDateTime.parse()只带有模式数字

我想从以下模式解析LocalDateTime:

yyyyMMddHHmmss000000
Run Code Online (Sandbox Code Playgroud)

这意味着通常的"yyyy ... ss"然后是六个尾随的零.

因此,格式化工作正常:

String p = "yyyyMMddHHmmss'000000'";
LocalDateTime.now().format(DateTimeFormatter.ofPattern(p));
Run Code Online (Sandbox Code Playgroud)

然后解析:

String p, v;
p = "yyyyMMddHHmmss";                                    // without '000000'
v = "20160131235930";
LocalDateTime.parse(v, DateTimeFormatter.ofPattern(p));  // it works


p = "yyyy-MMddHHmmss'000000'";                           // with '-' in between
v = "2016-0131235930000000";
LocalDateTime.parse(v, DateTimeFormatter.ofPattern(p));  // it works


p = "yyyyMMddHHmmss'000000'";                            // with '000000' but without '-'
v = "20160131235930000000";
LocalDateTime.parse(v, DateTimeFormatter.ofPattern(p));  // it throws Exception
Run Code Online (Sandbox Code Playgroud)

例外情况:

java.time.format.DateTimeParseException: Text '20160131235930000000' could not be parsed at index 0
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.LocalDateTime.parse(LocalDateTime.java:492) …
Run Code Online (Sandbox Code Playgroud)

java datetime parsing java-8 java-time

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

dd-MMM-yyyy格式的java.time.format.DateTimeParseException

我正在尝试解析dd-MMM-yyyy格式的日期.

package com.company;

import javax.swing.text.DateFormatter;
import java.time.format.DateTimeFormatter;

import java.time.*;
import java.util.Locale;

public class Main {

    public static void main(String[] args) {
        // write your code here
        MonthDay m;
        Locale.setDefault(Locale.ENGLISH);
        DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd-MMM-yyyy");
        String dateString = "12-jan-1900";

        try
        {
            LocalDate ddd = LocalDate.parse(dateString,dTF);
            System.out.println(ddd.toString());
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        //System.out.println(d.toString());

    }
}
Run Code Online (Sandbox Code Playgroud)

它抛出以下异常

java.time.format.DateTimeParseException: Text '12-jan-1900' could not be parsed at index 3
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.LocalDate.parse(LocalDate.java:400)
    at com.company.Main.main(Main.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) …
Run Code Online (Sandbox Code Playgroud)

java datetime parsing date java-time

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

Java8 java.time:如何更改星期几和当天的开始时间?

假设我希望我的星期在星期二开始,那天应该从早上5:30开始.

这意味着,像这样的代码应该工作:

// LocalDateTimes created with the "standard" ISO time
LocalDateTime tuesday_4_30 = LocalDateTime.now()
                                 .with(TemporalAdjusters.next(DayOfWeek.TUESDAY))
                                 .withHour(4).withMinute(30);

LocalDateTime tuesday_6_30    = tuesday_4_30.withHour(6).withMinute(30);
LocalDateTime previous_monday = tuesday_4_30.minusDays(1);

// eventual adjustment using TemporalAdjusters here? like this?
// tuesday_4_30 = tuesday_4_30.with(new MyTemporalAdjuster(DayOfWeek.TUESDAY, 5, 30));
// <do the same for 6_30 and previous monday>
// or possibly change some global parameter like Chronology, Locale, or such..

Assert.assertEquals(tuesday_4_30.getDayOfWeek(), DayOfWeek.MONDAY);

Assert.assertEquals(tuesday_6_30.getDayOfWeek(), DayOfWeek.TUESDAY);

// there is 1 week between the previous monday and the next tuesday 6:30
Assert.assertEquals( ChronoUnit.WEEKS.between(previous_monday,tuesday_6_30), …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-time

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

如何用模式格式化java.time.LocalDateTime和java.time.LocalDate?

在下面的剪辑中,属性$F是类java.time.LocalDateTime或java.time.LocalDate.

<textField pattern="EE. dd.MM.yyyy">
    <reportElement...>
    </reportElement>
    <textFieldExpression><![CDATA[$F{theLocalDateTime}]]></textFieldExpression>
</textField>
Run Code Online (Sandbox Code Playgroud)

如何pattern在jasper报告中使用textField格式化此属性 ?

java jasper-reports java-time

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

杰克逊:解析自定义偏移日期时间

我有一个具有时间戳属性的模型:

class Model {
    @JsonProperty("timestamp")
    private OffsetDateTime timestamp;
}
Run Code Online (Sandbox Code Playgroud)

时间戳的格式如下:

2017-09-17 13:45:42.710576+02
Run Code Online (Sandbox Code Playgroud)

OffsetDateTime 无法解析这个:

com.fasterxml.jackson.databind.exc.InvalidFormatException:无法java.time.OffsetDateTime从字符串"2017-09-17 13:45:42.710576 + 02" 反序列化类型的值:文本'2017-09-17 13:45:42.710576 + 02'可以不能在索引10处解析

我怎样才能解决这个问题?

java datetime jackson datetime-parsing java-time

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

在Java中更改`DateTimeFormatter`模式> 8

运行:

Locale locale = Locale.US;
String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
        FormatStyle.LONG, 
        FormatStyle.LONG,
        Chronology.ofLocale(locale), 
        locale);
System.out.println("pattern: " + pattern);
Run Code Online (Sandbox Code Playgroud)

输出:

pattern: MMMM d, yyyy h:mm:ss a z   // Java  8.0.171-oracle
pattern: MMMM d, y 'at' h:mm:ss a z // Java 11.0.0-open
Run Code Online (Sandbox Code Playgroud)

我发现Oracle使用iana-tz数据库(https://data.iana.org/time-zones/tz-link.html)来管理时区数据(请参阅https://www.oracle.com/technetwork/java /javase/tzdata-versions-138805.html).

但是,我没有发现任何关于标准日期格式的更改.调查源代码,似乎在Java 8中,该函数LocaleResources.getJavaTimeFormatData()加载了sun.text.resourcesbundle,而在Java 11中,它加载了sun.text.resources.cdlrbundle.

我的问题是:这样的变化是否记录在某个地方,可能是有原因的?

此外,确保与现有数据库兼容的最佳方法是什么?现在,我们有一个已识别模式的列表,所以我正在考虑通过解析新模式将旧模式添加到我的可识别模式列表中.

另一个值得注意的变化是:

Locale locale = Locale.US;
String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
        FormatStyle.SHORT, FormatStyle.MEDIUM, Chronology.ofLocale(locale), locale);
System.out.println("pattern: " + pattern);
Run Code Online (Sandbox Code Playgroud)

输出:

pattern: M/d/yy h:mm:ss a  // Java …
Run Code Online (Sandbox Code Playgroud)

java datetime-format java-time

6
推荐指数
0
解决办法
355
查看次数