我试过写一个Converter<java.sql.Date, java.time.LocalDate>但我不能让它与所有时区设置一起工作.
想法:
LocalDate,例如2014年8月20日,并将其保存到数据库,则无论客户端时区是什么,它都应该在数据库中显示为2014年8月20日.我的测试:
@Test public void dateConverter() {
for (int offset = -12; offset <= 12; offset++) {
TimeZone localTz = TimeZone.getTimeZone(ZoneOffset.ofHours(offset));
TimeZone.setDefault(localTz);
LocalDate ld = LocalDate.now();
sql.insertInto(DATE_TEST).set(new DateTestRecord(ld)).execute();
LocalDate savedLd = sql.selectFrom(DATE_TEST).fetchOne(DATE_TEST.DATE_);
assertEquals(savedLd, ld, "offset=" + offset);
sql.delete(DATE_TEST).execute();
}
}
Run Code Online (Sandbox Code Playgroud)
我的转换器:
public class DateConverter implements Converter<Date, LocalDate>{
@Override public LocalDate from(Date date) { return date.toLocalDate(); }
@Override public Date to(LocalDate ld) { return Date.valueOf(ld); }
@Override public Class<Date> fromType() { return Date.class; …Run Code Online (Sandbox Code Playgroud) 我试图解析三个数字,就像[2, 10, 2014]一个LocalDate使用新的Java 8日期和时间API.
一切听起来都比较容易,对吗?好吧,也许不是.
附加约束是我需要考虑区域设置,例如荷兰语和美国语使用不同的日期格式.
我唯一的输入是三个数字和区域设置,输出应该是一个格式良好的日期,形式为LocalDate.
我已经知道我将需要以下步骤:
Locale可以读取三个数字的转换器中获取转换器.LocalDate.我看了一下,特别是在DateTimeFormatter课堂上,但似乎想要明确地传递日,月和年格式,这对我来说不是一个选择.
我如何转换三个数字(以任何顺序表示日期,月份和年份)LocalDate?
示例:
荷兰格式:
Locale locale = new Locale("nl");
List<String> inputs = Arrays.asList("2", "10", "2014");
//output should equal
LocalDate.of(2014, 10, 2);
Run Code Online (Sandbox Code Playgroud)
美国格式:
Locale locale = Locale.ENGLISH;
List<String> inputs = Arrays.asList("10", "2", "2014");
//output should equal
LocalDate.of(2014, 10, 2);
Run Code Online (Sandbox Code Playgroud)
另外请记住,我在谈论数字的概念,但它们需要表示为字符串,以适应使用其他Unicode字符而不是数字0-9的语言.
我尝试用这种格式解析日期:ddYYYY.例如,我有字符串141968,我想知道day = 14和year = 1968.
我想我必须直接使用一个TemporalAccessor给DateTimeFormatter.parse(String),但我找不到如何使用这个结果.在调试时我看到结果是一个java.time.Parsed不公开但包含我想要的字段的信息fieldValues.
我该如何解析这种特殊格式?
谢谢.
如下所示,
LocalDateTime currentUTCTime = LocalDateTime.now(ZoneId.of("UTC"));
String reqPattern = currentUTCTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS"));
System.out.println("Required pattern: " + reqPattern);
GregorianCalendar calendar = GregorianCalendar.from(currentUTCTime.atZone(ZoneId.systemDefault()));
XMLGregorianCalendar xcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
System.out.println("But Showing As :" + xcal);
Run Code Online (Sandbox Code Playgroud)
我希望输出为2015-06-18 11:59:15:135,但是当我设置xcal为XML标记时XMLGregorianCalender,它显示为2015-06-18T11:59:15.135+05:30.
我该如何删除该+05:30部分?
我正在编写一些代码,用随机数据填充MySQL数据库以进行测试.我需要在DATE1970-2015之间填充一个随机日期的列.
这是相关的方法:
public Date dateGenerator() throws Exception {
Random ry = new Random();
Random rm = new Random();
Random rd = new Random();
int year = 1969 + ry.nextInt(2015-1969+1);
int month = 1 + rm.nextInt(12);
int day = 1 + rm.nextInt(31);
if (month==2 && day>28){
day = day - 3;
} else {
if((month%2==0 && month != 8 ) && day==31 ){
day = day -1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的目的是创建三个随机整数(日,月,年),并以某种方式将它们组合成一些Date对象以传递给数据库.但数据库拒绝我尝试提供的所有内容.
如果可以的话,如果你可以向我提供基于最新java.time图书馆的建议,那将对我很有教育意义.
我在运行一些代码时遇到了一个奇怪的错误.这是一个展示相同的简单版本.
public class DateTest {
public static void main(String[] args) {
LocalDate decLast = LocalDate.of(2015, 12, 31);
LocalDate novLast = LocalDate.of(2015, 11, 30);
LocalDate octLast = LocalDate.of(2015, 10, 31);
System.out.println(decLast+" "+novLast+" "+octLast);
System.out.println(decLast.format(DateTimeFormatter.ofPattern("dd M YY"))+" "
+novLast.format(DateTimeFormatter.ofPattern("dd M YY"))+" "
+octLast.format(DateTimeFormatter.ofPattern("dd M YY")));
}
}
Run Code Online (Sandbox Code Playgroud)
这返回了以下结果
2015-12-31 2015-11-30 2015-10-31
31/12/16 30/11/15 31/10/15
Run Code Online (Sandbox Code Playgroud)
不知何故,2015年12月31日被转换为2016年12月31日.我写了一个for循环来做同样的不同年份,并发现多年来存在变化.12月26日以下的任何日期都不存在该错误.这是一个错误还是我错过了什么?
如果我在这里混淆任何ISO日期相关条款,请提前道歉.
我希望能够在给定的一年中每周进行一次迭代(比如,2015年).我意识到您可以计算2015年1月1日到2015年12月31日之间的周数,但这不符合一周的ISO标准.相反,它给出了两个日期之间7天的时间段.2015年第一个ISO周并不一定从2015年1月1日开始.
如果我可以获得第一周的第一个日期,我相信我可以简单地迭代ZonedDateTime.plusWeeks(1)52周.您可以通过字段访问者获取任意日期的周数:
ZonedDateTime date = ZonedDateTime.now();
WeekFields weekFields = WeekFields.of(Locale.getDefault());
int weekNumber = date.get(weekFields.weekOfWeekBasedYear());
Run Code Online (Sandbox Code Playgroud)
鉴于此,我认为必须有可能在Java8 Time API中获取特定年份第一周第一天的日期,但我还没有找到办法.
LocalDate使用特定格式在Java 8中格式化Locale可以像这样实现:
DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(myLocale).format(value);
DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(myLocale).format(value);
DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).withLocale(myLocale).format(value);
DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(myLocale).format(value);
Run Code Online (Sandbox Code Playgroud)
假设value = LocalDate.now()这将导致:
// myLocale = Locale.ENGLISH
6/30/16
Jun 30, 2016
June 30, 2016
Thursday, June 30, 2016
// myLocale = Locale.GERMAN
30.06.16
30.06.2016
30. Juni 2016
Donnerstag, 30. Juni 2016
// myLocale = new Locale("es", "ES")
30/06/16
30-jun-2016
30 de junio de 2016
jueves 30 de junio de 2016
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,Java决定使用哪个分隔符(" - ",".","/",""等)以及如何对日期元素进行排序(例如,前一个月,反之亦然等) - 在某些语言环境中它可能是那一年第一,等等.
我的问题是:我如何格式化java.time.YearMonth并java.time.MonthDay依赖于Locale上面的例子?
基于这个例子,我希望这样的结果......
......为YearMonth:
// myLocale …Run Code Online (Sandbox Code Playgroud) 我正在尝试从定义为使用RFC1123兼容日期时间规范的数据源解析时间戳.我的代码是:
value = Instant.from (DateTimeFormatter.RFC_1123_DATE_TIME.parse (textValue));
Run Code Online (Sandbox Code Playgroud)
这适用于某些数据,但我得到包含区域名称的字符串的例外,甚至是RFC2822中定义的字符串(由于它废弃RFC822而间接引用RFC1123).例子:
java.time.format.DateTimeParseException: Text 'Sun, 20 Aug 2017 00:30:00 UT' could not be parsed at index 26
java.time.format.DateTimeParseException: Text 'Mon, 21 Aug 2017 15:00:00 EST' could not be parsed at index 26
Run Code Online (Sandbox Code Playgroud)
我如何说服DateTimeFormatter接受这种类型的约会?
为什么java.time.Clock有区域信息?从时钟中你只能Instant在调用instant()方法时获得- 这是一个没有区域信息的时间.
唯一的目的是让时区中的区域可用,例如像这样创建ZonedDateTime吗?
ZonedDateTime.ofInstant(clock().instant(), clock().getZone())
那么zonedDateTime()在Clock类中有一个方法会不会有意义呢?