我想解析2015-10-01'与bool aNewBarEVENT( const string anFxSYMBOL, // _Symbol,
const int aTimeFRAME // PERIOD_M6
)
{ static int pBars = EMPTY; // previous
int oBars = iBars( anFxSYMBOL, aTimeFRAME ); // observed
if ( pBars == oBars ) return( False ); // .NACK
pBars = oBars, return( True ); // .UPD + .ACK
}
。我要做的是
LocalDateTime
但是我想像
一样解析它LocalDate localDate = LocalDate.parse('2015-10-01');
LocalDateTime localDateTime = localDateTime.of(localDate, LocalTime.MIN);
字符串的一小部分差异也会引发异常。
// throws DateTimeParseException
LocalDateTime date = LocalDateTime.parse('2015-10-01', DateTimeFormatter.ISO_LOCAL_DATE);
我可以使用Java 8 Date API轻松解析日期字符串吗?
答案 0 :(得分:7)
如果要将日期字符串解析为"2015-10-01"
和"2015-9-5"
至LocalDateTime
个对象,则可以使用DateTimeFormatter
构建自己的DateTimeFormatterBuilder
:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy")
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR)
.appendLiteral('-')
.appendValue(DAY_OF_MONTH)
.parseDefaulting(HOUR_OF_DAY, HOUR_OF_DAY.range().getMinimum())
.parseDefaulting(MINUTE_OF_HOUR, MINUTE_OF_HOUR.range().getMinimum())
.parseDefaulting(SECOND_OF_MINUTE, SECOND_OF_MINUTE.range().getMinimum())
.parseDefaulting(NANO_OF_SECOND, NANO_OF_SECOND.range().getMinimum())
.toFormatter();
System.out.println(LocalDateTime.parse("2015-9-5", formatter));
System.out.println(LocalDateTime.parse("2015-10-01", formatter));
每个字段的可变长度由对appendValue(field)
的调用处理。引用Javadoc:
像这样的可变宽度值的解析器通常表现得很贪婪,需要一个数字,但要接受尽可能多的数字。
这意味着它将能够解析用1或2位数字格式化的月份和日期。
要构建LocalDateTime
,我们还需要为此构建器提供LocalTime
。这是通过对LocalTime
的每个字段使用parseDefaulting(field, value)
来完成的。如果要解析的String中不存在该字段,则此方法将获取该字段的字段和默认值。因为在我们的情况下,时间信息不会出现在字符串中,所以将选择默认值,即该字段的有效值范围的最小值(通过调用getMinimum
到该字段的ValueRange
;也许我们也可以在这里硬编码0。
如果要解析的String可能包含时间信息,我们可以使用DateTimeFormatter
的可选部分,如下所示:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy")
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR)
.appendLiteral('-')
.appendValue(DAY_OF_MONTH)
.appendPattern("[ HH:mm]") // optional sections are surrounded by []
.parseDefaulting(HOUR_OF_DAY, HOUR_OF_DAY.range().getMinimum())
.parseDefaulting(MINUTE_OF_HOUR, MINUTE_OF_HOUR.range().getMinimum())
.parseDefaulting(SECOND_OF_MINUTE, SECOND_OF_MINUTE.range().getMinimum())
.parseDefaulting(NANO_OF_SECOND, NANO_OF_SECOND.range().getMinimum())
.toFormatter();
System.out.println(LocalDateTime.parse("2015-9-5", formatter));
System.out.println(LocalDateTime.parse("2015-10-01", formatter));
System.out.println(LocalDateTime.parse("2015-1-1 10:10", formatter));
答案 1 :(得分:0)
解析日期和时间
要从字符串创建private void createDirectoryAndSaveFile(Bitmap imageToSave, String fileName) {
File direct = new File(Environment.getExternalStorageDirectory() + "/DirName");
if (!direct.exists()) {
File wallpaperDirectory = new File("/sdcard/DirName/");
wallpaperDirectory.mkdirs();
}
File file = new File(new File("/sdcard/DirName/"), fileName);
if (file.exists()) {
file.delete();
}
try {
FileOutputStream out = new FileOutputStream(file);
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
对象,您可以使用静态LocalDateTime
方法。它需要一个字符串和一个LocalDateTime.parse()
作为参数。 DateTimeFormatter
用于指定日期/时间模式。
DateTimeFormatter
格式化日期和时间
要从String str = "1986-04-08 12:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
对象创建格式化字符串,可以使用format()方法。
LocalDateTime
请注意,DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.of(1986, Month.APRIL, 8, 12, 30);
String formattedDateTime = dateTime.format(formatter); // "1986-04-08 12:30"
中有一些常用的日期/时间格式预定义为常量。例如:使用DateTimeFormatter
格式化上面的DateTimeFormatter.ISO_DATE_TIME
实例将导致字符串" 1986-04-08T12:30:00"。
LocalDateTime
()和parse
()方法适用于所有与日期/时间相关的对象(例如LocalDate或ZonedDateTime)
答案 2 :(得分:0)
你可以尝试
private static final DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss").withResolverStyle(ResolverStyle.LENIENT);
答案 3 :(得分:0)
针对特定用例的简单解决方案是定义自己的格式。在此示例中,即使我在模式中为月份指定了一个M
,也为一天指定了一个d
,它仍然将两个示例解析为相同。
@Test
public void parsing_singleDigitDates_andDoubleDigitDates_areEqual()
{
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-M-d");
LocalDate dt1 = LocalDate.parse("2015-09-05", fmt);
LocalDate dt2 = LocalDate.parse("2015-9-5", fmt);
Assert.assertEquals(dt1, dt2);
}
在看到DateTimeFormatterBuilder
需要您编写才能解决相同问题的代码后,我决定写这个答案。