小编Ole*_*.V.的帖子

为什么这个日期解析失败了?

我正在尝试将字符串转换为LocalDateTime对象.

@Test
public void testDateFormat() {
   String date = "20171205014657111";
   DateTimeFormatter formatter = 
       DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
   LocalDateTime dt = LocalDateTime.parse(date, formatter);
}
Run Code Online (Sandbox Code Playgroud)

我希望这个测试能够通过.

我收到以下错误:

java.time.format.DateTimeParseException:无法在索引0处解析文本'20171205014657111'

java datetime datetime-parsing java-time

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

将字符串转换为Instant

我试图使用java 8或utils包将string中的datetime转换为即时.

例如.

String requestTime = "04:30 PM, Sat 5/12/2018";
Run Code Online (Sandbox Code Playgroud)

Instant reqInstant should result in 2018-05-12T20:30:00.000Z
Run Code Online (Sandbox Code Playgroud)

reqString位于美国/多伦多时区.

这是我试过的

 String strReqDelTime = "04:30 PM, Sat 5/12/2018";
 Date date = new SimpleDateFormat("hh:mm a, EEE MM/dd/yyyy").parse(requestTime);
 Instant reqInstant = date.toInstant();
Run Code Online (Sandbox Code Playgroud)

上面的代码导致了"2018-05-12T23:30:00Z".

任何帮助表示赞赏.

java timezone date zoneddatetime java.time.instant

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

推荐哪个: Instant.now().toEpochMilli() 或 System.currentTimeMillis()

在Java中,我们可以有许多不同的方式来获得当前的时间戳,但哪一个建议: Instant.now().toEpochMilli()System.currentTimeMillis()

java epoch milliseconds java-time java.time.instant

13
推荐指数
3
解决办法
8856
查看次数

java 8 time api - Instant.now(clock)vs LocaldateTime.now(clock)

对于以下java 8代码

  1. System.out.println(LocalDateTime.now(Clock.systemDefaultZone())); 
  2. System.out.println(Instant.now(Clock.systemDefaultZone()));
Run Code Online (Sandbox Code Playgroud)

第1行打印当前时间通过添加偏移但第2行打印当前时间而不添加偏移量.

我检查了两者的源代码,发现通过添加偏移LocaDateTime.now(clock)返回clock.instant()返回时间但Instant.now(clock)没有这样做.

为什么这样设计?在这两种情况下,我们不期待相同的结果吗?

java time datetime java-8 java.time.instant

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

Java - 解析日期/期间的优雅方式?

根据ISO-8601标准,有4种表达间隔/持续时间的方式:

  1. 开始和结束,例如"2007-03-01T13:00:00Z/2008-05-11T15:30:00Z"

  2. 开始和持续时间,例如"2007-03-01T13:00:00Z/P1Y2M10DT2H30M"

  3. 持续时间和结束,例如"P1Y2M10DT2H30M/2008-05-11T15:30:00Z"

  4. 持续时间,例如"P1Y2M10DT2H30M",带有附加的上下文信息

仅使用Java 8(没有Joda,扩展等),是否有处理案例1-3的优雅方法?

我知道Duration.Parse()并且Period.Parse(),但我想知道是否有一种处理这4种情况的优雅方式.例如:

String datePeriod = "2016-07-21/P6D";
String twoDates   = "2016-07-21/2016-07-25";

Duration d = Duration.parse(datePeriod); // DateTimeParseException
Duration p = Duration.parse(twoDates); // same
Run Code Online (Sandbox Code Playgroud)

我目前的思维过程非常草率,我百分百肯定有更好的方法.对于每种情况,使用嵌套的try/catch块分别处理4个案例,这看起来有点像反模式,如果有的话.(拆分/,解析第一个块的日期,检查错误,解析第一个块的时间段,解析第二个块的日期,检查错误......你明白了)

任何提示将非常感谢!

-

此外,ISO 8601时间间隔解析在Java中的答案并没有真正帮助我,因为最顶层的答案只关心这些PT...东西.

java datetime duration period java-8

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

在return语句中找不到适合ArrayList <String> .toArray(String [] :: new)的方法

我正在使用Codingbat网站,特别是AP-1中的这种方法

public String[] wordsWithout(String[] words, String target) {
  ArrayList<String> al = new ArrayList<>(Arrays.asList(words));
  al.removeIf(s -> s.equals(target));
  return al.toArray(new String[al.size()]);
}
Run Code Online (Sandbox Code Playgroud)

这个实现工作,以及它当前提交的内容,但是当我将return语句更改为

return al.toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)

据我所知,这应该工作,给出以下错误:

no suitable method found for toArray((size)->ne[...]size])
method java.util.Collection.<T>toArray(T[]) is not applicable
  (cannot infer type-variable(s) T
    (argument mismatch; Array is not a functional interface))
method java.util.List.<T>toArray(T[]) is not applicable
  (cannot infer type-variable(s) T
    (argument mismatch; Array is not a functional interface))
method java.util.AbstractCollection.<T>toArray(T[]) is not applicable
  (cannot infer type-variable(s) T
    (argument mismatch; Array is not …
Run Code Online (Sandbox Code Playgroud)

java lambda arraylist toarray java-8

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

如何使用Java 8 DateTimeFormatter更改解析两个字母年份的基准日期?

如果我使用类似于d/M/yy创建Java 8 DateTimeFormatter的模式(例如使用DateTimeFormatter.ofPattern(pattern);(我将仅用于解析,而不是格式化),它将所有两个字母的年份解释为20xx,例如解析一个字符串,如同13/5/99被解释为2099-05-13,在我的情况下是错误的(它应该是在1999年).

在我的应用程序中,我试图解析OCR'd文档中的日期,例如仍然可以从90年代开始,所以使用旧的SimpleDateFormat行为将日期解释为在当前日期之前和之后的20年之内我很好.但由于各种原因,我仍然希望将整个日期解析逻辑切换到新的Java 8 DateTimeFormatters.

通过Java源代码,我看到这都是相对于常量解释的ReducedPrinterParser.BASE_DATE,但我认为无法更改从模式构建自己的格式化程序时使用的值.这是不可能的,还是我错过了指定解析两个字母年份的行为的可能性?

java parsing date 2-digit-year java-time

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

JEdi​​torPane.getPreferredSize并不总是在Java 9中工作?

这个问题是关于JEditorPaneJava 8和Java 9中的不同行为.我想知道其他人是否经历过相同的事情,是否它可能是Java 9中的一个错误,如果可能的话,你有如何在Java中处理它的输入9.

上下文:在我们(古老的)代码库中,我们使用的是子类JTable,并且在我们使用的子类之一的列中呈现多行HTML JEditorPane.我们JEditorPane.getPreferredSize()用于确定内容的高度并使用它来设置表格行的高度.它已经运作了很多年.它在Java 9中不起作用; 行显示只有10个像素高.在Windows和Mac上都可以看到.

我想向您展示两个代码示例.如果第一个和更短的一个适合您,请随意跳过第二个和更长的一个.

MCVE:

    JEditorPane pane = new JEditorPane("text/html", "");

    pane.setText("<html>One line</html>");
    System.out.println(pane.getPreferredSize());
    pane.setText("<html>Line one<br />Line 2<br />Third line<br />Line four</html>");
    System.out.println(pane.getPreferredSize());
Run Code Online (Sandbox Code Playgroud)

Java 8(1.8.0_131)中的输出:

java.awt.Dimension[width=48,height=15]
java.awt.Dimension[width=57,height=60]
Run Code Online (Sandbox Code Playgroud)

在Java 9(jdk-9.0.4)上:

java.awt.Dimension[width=49,height=15]
java.awt.Dimension[width=58,height=0]
Run Code Online (Sandbox Code Playgroud)

在Java 9中,我第一次设置文本时,首选高度反映了它.以后每次都没有.

我已经搜索过,看看我是否能找到任何可能导致此问题的错误信息,但没有发现任何相关内容.

问题:这是否意图(改变)行为?这是一个错误?

更长的例子

public class TestJEditorPaneAsRenderer extends JFrame {

    public TestJEditorPaneAsRenderer() {
        super("Test JEditorPane");

        MyRenderer renderer = new MyRenderer();

        String html2 = "<html>one/2<br />two/2</html>";
        String html4 = "<html>one of four<br />two of four<br />"
                + …
Run Code Online (Sandbox Code Playgroud)

java swing jeditorpane preferredsize java-9

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

java.util.Calendar - 1947 年

我在 WSO2 平台中发现了一个有趣的行为,使用 Calendar 将字符串转换为日期。WSO2 使用 java.util.Calendar 作为最终结果。我发现如果在下面的代码片段中使用了 01.01.1947 - 23.02.1947 的日期,结果总是在一天前给我们。我发现它是我们的时区这样做,因为它向前一小时。意思是日历将结果倒退一小时,我们得到晚上 11 点前的一天。

我们已经通过不转换为 Date 来解决问题。所以这不是问题。

问题是,为什么这只发生在 01.01.1947 - 23.02.1947 的日期?

这是一个可以模拟问题的示例代码片段:

    int year = 1947;
    int month = 2;
    int day = 23;
    int timezoneOffset = TimeZone.getDefault().getRawOffset();
    Calendar calendar = Calendar.getInstance();
    calendar.clear();
    calendar.set(1, year);
    calendar.set(2, month - 1);
    calendar.set(5, day);
    calendar.set(15, timezoneOffset);

    System.out.println(calendar.getTime());
Run Code Online (Sandbox Code Playgroud)

在我的时区,timezoneOffset 的结果是 3600000,以防您想测试我的时区(捷克共和国)。

请注意,这是用 WSO2 编写的代码,如果对此有疑问,我无法更改它。

我为此使用的 Java 版本是:openjdk 11.0.8 2020-07-14

链接: WSO2平台

java

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

Java 8的datetime包DayOfWeek枚举顺序

我正在查看Java 8的新日期时间包的教程.在关于DayOfWeekMonth枚举的页面上,它表示DayOfMonth枚举从星期一到星期日.这是为什么?我使用的每个其他系统(包括.NET)都在周日开始.

java datetime library-design dayofweek java-time

9
推荐指数
2
解决办法
273
查看次数