标签: java-time

jooq转换器:从java.sql.Date到java.time.LocalDate

我试过写一个Converter<java.sql.Date, java.time.LocalDate>但我不能让它与所有时区设置一起工作.

想法:

  • 如果客户端代码有一个LocalDate,例如2014年8月20日,并将其保存到数据库,则无论客户端时区是什么,它都应该在数据库中显示为2014年8月20日.
  • 如果数据库包含2014年8月20日的日期,则无论客户端时区是什么,客户端都应收到2014年8月20日的LocalDate.

我的测试:

@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)

java sql jdbc jooq java-time

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

如何使用Locale将三个数字解析为LocalDate?

我试图解析三个数字,就像[2, 10, 2014]一个LocalDate使用新的Java 8日期和时间API.

一切听起来都比较容易,对吗?好吧,也许不是.
附加约束是我需要考虑区域设置,例如荷兰语和美国语使用不同的日期格式.

我唯一的输入是三个数字和区域设置,输出应该是一个格式良好的日期,形式为LocalDate.

我已经知道我将需要以下步骤:

  1. 从Locale可以读取三个数字的转换器中获取转换器.
  2. 使用转换器,将三个数字转换为a 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的语言.

java java-8 java-time

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

使用DateTimeFormatter解析没有月份的日期

我尝试用这种格式解析日期:ddYYYY.例如,我有字符串141968,我想知道day = 14和year = 1968.

我想我必须直接使用一个TemporalAccessor给DateTimeFormatter.parse(String),但我找不到如何使用这个结果.在调试时我看到结果是一个java.time.Parsed不公开但包含我想要的字段的信息fieldValues.

我该如何解析这种特殊格式?

谢谢.

java java-8 java-time

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

Java8 LocalDateTime到XMLGregorianCalender删除"+05:30"部分

如下所示,

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部分?

java-8 java-time

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

使用java.time生成随机LocalDate

我正在编写一些代码,用随机数据填充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图书馆的建议,那将对我很有教育意义.

java mysql random date java-time

6
推荐指数
2
解决办法
6490
查看次数

DateTimeFormatter不能一直工作,bug?

我在运行一些代码时遇到了一个奇怪的错误.这是一个展示相同的简单版本.

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日以下的任何日期都不存在该错误.这是一个错误还是我错过了什么?

java datetime java-8 java-time

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

如何在Java 8中一年中每周迭代一次?

如果我在这里混淆任何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中获取特定年份第一周第一天的日期,但我还没有找到办法.

java java-time

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

如何根据区域设置格式化YearMonth和MonthDay?

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)

java java-8 java-time

6
推荐指数
2
解决办法
1468
查看次数

java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME无法解析时区名称

我正在尝试从定义为使用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 parsing date datetime-parsing java-time

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

为什么java.time.Clock有区域信息?

为什么java.time.Clock有区域信息?从时钟中你只能Instant在调用instant()方法时获得- 这是一个没有区域信息的时间.

唯一的目的是让时区中的区域可用,例如像这样创建ZonedDateTime吗? ZonedDateTime.ofInstant(clock().instant(), clock().getZone())

那么zonedDateTime()在Clock类中有一个方法会不会有意义呢?

java timezone jsr310 java-time

6
推荐指数
2
解决办法
281
查看次数

标签 统计

java-time ×10

java ×9

java-8 ×5

date ×2

datetime ×1

datetime-parsing ×1

jdbc ×1

jooq ×1

jsr310 ×1

mysql ×1

parsing ×1

random ×1

sql ×1

timezone ×1