在测试我的一些方法时,我遇到了一个奇怪的问题,我似乎已经能够获得我的问题的具体例子.
我使用的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.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
我开发了一个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等......
无论如何,这似乎做我想要的,但这是正确的方法吗?
使用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
我犯了什么错误以及如何解决它?
我想从以下模式解析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) 我正在尝试解析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) 假设我希望我的星期在星期二开始,那天应该从早上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) 在下面的剪辑中,属性$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格式化此属性 ?
我有一个具有时间戳属性的模型:
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处解析
我怎样才能解决这个问题?
运行:
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)