我正在尝试将字符串转换为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 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中,我们可以有许多不同的方式来获得当前的时间戳,但哪一个建议:
Instant.now().toEpochMilli()或System.currentTimeMillis()
对于以下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)没有这样做.
为什么这样设计?在这两种情况下,我们不期待相同的结果吗?
根据ISO-8601标准,有4种表达间隔/持续时间的方式:
开始和结束,例如"2007-03-01T13:00:00Z/2008-05-11T15:30:00Z"
开始和持续时间,例如"2007-03-01T13:00:00Z/P1Y2M10DT2H30M"
持续时间和结束,例如"P1Y2M10DT2H30M/2008-05-11T15:30:00Z"
持续时间,例如"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...东西.
我正在使用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) 如果我使用类似于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,但我认为无法更改从模式构建自己的格式化程序时使用的值.这是不可能的,还是我错过了指定解析两个字母年份的行为的可能性?
这个问题是关于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) 我在 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 8的新日期时间包的教程.在关于DayOfWeek和Month枚举的页面上,它表示DayOfMonth枚举从星期一到星期日.这是为什么?我使用的每个其他系统(包括.NET)都在周日开始.