相关疑难解决方法(0)

Java日期解析具有微秒或纳秒精度

根据SimpleDateFormat类文档,Java它的日期模式不支持超过毫秒的时间粒度.

所以,日期字符串就像

  • 2015-05-09 00:10:23.999750900 //最后9位数字表示纳秒

通过模式解析时

  • yyyy-MM-dd HH:mm:ss.SSSSSSSSS // 9'S'符号

实际上将.符号后面的整数解释为(接近10亿!)毫秒,而不是纳秒,导致日期

  • 2015-05-20 21:52:53 UTC

即超过11天.令人惊讶的是,使用较少数量的S符号仍会导致所有9位数被解析(而不是,例如,最左边的3位.SSS).

有两种方法可以正确处理此问题:

  • 使用字符串预处理
  • 使用自定义SimpleDateFormat实现

是否有任何其他方法可以通过向标准SimpleDateFormat实现提供模式来获得正确的解决方案,而无需任何其他代码修改或字符串操作?

java milliseconds simpledateformat

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

Java 8 Date相当于具有多种解析器格式的Joda的DateTimeFormatterBuilder?

我目前有一个Joda日期解析器,它使用DateTimeFormatterBuilder,我可能会收到六种不同的日期格式.

我正在迁移到Java 8的Date例程,并没有看到等效的.

如何使用Java 8 Dates做这样的事情?

DateTimeParser[] parsers = { 
    DateTimeFormat.forPattern( "yyyy/MM/dd HH:mm:ss.SSSSSS" ).getParser() ,
    DateTimeFormat.forPattern( "yyyy-MM-dd HH:mm:ss" ).getParser() ,
    DateTimeFormat.forPattern( "ddMMMyyyy:HH:mm:ss.SSS Z" ).getParser() ,
    DateTimeFormat.forPattern( "ddMMMyyyy:HH:mm:ss.SSS" ).getParser() ,
    DateTimeFormat.forPattern( "ddMMMyyyy:HH:mm:ss.SSSSSS" ).getParser() ,
    DateTimeFormat.forPattern( "yyyy-MM-dd HH:mm:ss.SSS" ).getParser() 
};

DateTimeFormatter dateTimeFormatterInput = new DateTimeFormatterBuilder()
     .append( null, parsers ).toFormatter();
Run Code Online (Sandbox Code Playgroud)

java jodatime java-time

21
推荐指数
3
解决办法
8254
查看次数

多个模式的绑定日期

我曾经使用像这样的Spring 属性来支持Java DateJoda Localdate模式绑定DateTimeFormat pattern

@DateTimeFormat(pattern = "dd.MM.yyyy")
private LocalDate creationDate;
Run Code Online (Sandbox Code Playgroud)

但我需要支持两种日期模式,例如:

如果用户输入31/12/199931/12/99,则两者都可以绑定到相同的值31/12/1999.是否可以为此定义两种模式@DateTimeFormat

编辑:

我试图将模式更改为

@DateTimeFormat(pattern = "dd.MM.yy")
private LocalDate creationDate;
Run Code Online (Sandbox Code Playgroud)

我发现它可以处理这两种情况(例如当用户输入31/12/1999或者31/12/99两者都受到约束时)31/12/1999.任何意见?

spring date spring-mvc date-format jodatime

8
推荐指数
1
解决办法
2952
查看次数

如何用java中的两个或三个毫秒数字解析日期时间?

这是我将String解析成的方法LocalDateTime.

    public static String formatDate(final String date) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS");
        LocalDateTime formatDateTime = LocalDateTime.parse(date, formatter);
        return formatDateTime.atZone(ZoneId.of("UTC")).toOffsetDateTime().toString();
    }
Run Code Online (Sandbox Code Playgroud)

但这仅适用于输入字符串, 2017-11-21 18:11:14.05 但无法2017-11-21 18:11:14.057 使用DateTimeParseException.

如何定义适用于.SS.SSS?的格式化程序?

java datetime-format datetime-parsing java-time dateformatter

7
推荐指数
3
解决办法
2930
查看次数

在期待异常时避免使用空捕获块

我正在尝试使用分析日期SimpleDateFormat.由于我的服务采用多种日期格式,我采用了这种方法:

String[] formats = {
        "yyyy-MM-dd'T'HH:mm:ss.SSSZ",
        "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
        "yyyy-MM-dd'T'HH:mm:ss.SSS-HH:mm",
        "EEE MMM dd HH:mm:ss Z yyyy"};

for (String format : formats)
{
    try
    {
        return new SimpleDateFormat(format).parse(dateString);
    }
    catch (ParseException e) {}
}
return null;
Run Code Online (Sandbox Code Playgroud)

其背后的基本原理try-catch是,如果当前日期格式无法解析dateString,Exception则会抛出一个并且代码将继续循环,直到找到合适的日期格式或返回null.

catch块简直就是有那么该try块将具有以下一些东西(如果没有遵循可能发生编译错误try).

我可以保持代码原样,但空catch块是不好的做法.将来维持其他人也会感到困惑.它简直不优雅.

我可以在catch块中添加以下内容:

catch (Exception e)
{
    if (!(e instanceof ParseException))
    {
        throw e;
    }
}
Run Code Online (Sandbox Code Playgroud)

但同样,内部的代码没有任何意义,因为没有Exception其他的ParseException可以被try块抛出(我NullPointerException …

java exception try-catch date-format control-flow

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

Java或Scala使用java.time解析具有多种不同格式的日期的快速方法

我想要一个通用的快速解析器来处理随机格式的日期:

  • 2018年
  • 2018-12-31
  • 2018/12/31
  • 2018年12月31日
  • 20181231151617
  • 2018-12-31T15:16:17
  • 2018-12-31T15:16:17.123456
  • 2018-12-31T15:16:17.123456Z
  • 2018-12-31T15:16:17.123456 UTC
  • 2018-12-31T15:16:17.123456 + 01:00
  • ...如此多的可能性

有一种不错的方法吗?

目前,我正计划使用以下方式:

val formatter = new DateTimeFormatterBuilder()
  .appendPattern("[yyyy-MM-dd'T'HH:mm:ss]")
  .appendPattern("[yyyy-MM-dd]")
  .appendPattern("[yyyy]")
  // add so many things here
  .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
  .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
  .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
  .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
  .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
  .parseDefaulting(ChronoField.MICRO_OF_SECOND, 0)
  .toFormatter()


val temporalAccessor = formatter.parse("2018")
val localDateTime = LocalDateTime.from(temporalAccessor)
localDateTime.getHour
val zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault)
val result = Instant.from(zonedDateTime)
Run Code Online (Sandbox Code Playgroud)

但是,有比指定数百种格式更聪明的方法吗?

我发现的大多数答案都是过时的(在Java8之前),或者不关注性能和许多不同的格式。

java parsing scala date

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

Java中的Date.parse()是否可以安全使用,即使它已被弃用?如果没有,是否有可行的替代方案?

我经常使用Date.parse(String)来解析未知格式的日期.到目前为止,我的用例似乎工作正常,但我想知道为什么它被弃用了,我是否应该避免它?文档只是说:

As of JDK version 1.1, replaced by DateFormat.parse(String s)
Run Code Online (Sandbox Code Playgroud)

但是,DateFormat中没有静态解析方法,只是一个实例方法,它需要一个DateFormat对象,对于未知的日期格式,我不会这样做.

所以,我想知道......

  • Java设计师是否有任何关于他们为何选择弃用它的官方声明?
  • 如果这个方法到目前为止对我的用例工作正常,我可以依赖Java的未来版本中可用的这个功能吗?
  • 是否有一个可行的替代方法,不会因为解析多种可能的常见日期格式之一的字符串而弃用?

java string date standard-library deprecated

3
推荐指数
2
解决办法
1608
查看次数

Java日期时间格式检查和重置

字符串是一个输入,我必须检查它是否是这些格式中的任何一种.如果它是sdf1格式然后传递,如果它在sdf2,3 ....然后我添加缺少格式并用sdf1格式解析它

SimpleDateFormat sdf1 = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");
SimpleDateFormat sdf2 = new SimpleDateFormat("MM/dd/yyyy hh:mm:ssa");
SimpleDateFormat sdf3 = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
SimpleDateFormat sdf3 = new SimpleDateFormat("MM/dd/yyyy hh:mma");
SimpleDateFormat sdf3 = new SimpleDateFormat("MM/dd/yyyy hh:mm");
SimpleDateFormat sdf3 = new SimpleDateFormat("MM/dd/yyyy"); 
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的

try{
            // Parse if it is MM/dd/yyyy hh:mm:ss a
            cal = Calendar.getInstance();
            cal.setTime(sdf1.parse(inStr));
          }catch(Exception exp){
             try{
               cal = Calendar.getInstance();
               //Parse if it is MM/dd/yyyy hh:mm:ssa                      
               sdf2.parse(inStr);                 
               inStr = new StringBuilder(inStr).insert(str.length()-2, " ").toString();
               cal.setTime(sdf1.parse(inStr));
              }catch(Exception dte2){
                try{
                    cal = Calendar.getInstance();
                    //Parse …
Run Code Online (Sandbox Code Playgroud)

java datetime datetime-parsing java-8

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