在java中解析从零开始的月份字符串

问题描述 投票:0回答:3

我正在尝试解析一个看起来像这样的字符串:

2015, 2, 31, 17, 0, 1

所以我想我会用

SimpleDateFormat("yyyy, MM, dd, hh, mm, ss")

但它假设月份是从 1 开始的。在本例中,月份 (2) 是三月。我如何告诉 SimpleDateFormat 或任何其他类以从零开始的月份进行解析?

java parsing date
3个回答
4
投票

使用日历

String[] yourString = "2015, 2, 31, 17, 0, 1".split(",");

Calendar c = new GregorianCalendar();
c.set(Calendar.YEAR, Integer.valueOf(yourString[0]));
c.set(Calendar.MONTH, Integer.valueOf(yourString[1]));
c.set(Calendar.DAY_OF_MONTH, Integer.valueOf(yourString[2]));
c.set(Calendar.HOUR_OF_DAY, Integer.valueOf(yourString[3]));
c.set(Calendar.MINUTE, Integer.valueOf(yourString[4]));
c.set(Calendar.SECOND, Integer.valueOf(yourString[5]));

0
投票

我可以看到一个解决方案增加一个月

Date newDate = DateUtils.addMonths(new Date(), 1);

带日历

Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.MONTH, 1);

默认情况下,月份是基于 0 的索引。见

为什么 Java 日历中的一月是 0?

为什么使用 Java SimpleDateFormat 会少几个月?


0
投票

java.time

是现代 Java,使用 java.time 类。

将输入字符串分成几部分。将每个部分解析为

int
整数。对于第二部分(在索引 1 处),您需要添加 1 来纠正错误的从零开始的计数。

使用前三个部分制作

LocalDate
。使用后三个部分制作一个
LocalTime
。组合成一个
LocalDateTime
对象。

String input = "2015, 2, 31, 17, 0, 1";
String[] parts = input.split ( ", " );
LocalDate ld = LocalDate.of ( Integer.parseInt ( parts[ 0 ] ) , Integer.parseInt ( parts[ 1 ] ) + 1 , Integer.parseInt ( parts[ 2 ] ) );
LocalTime lt = LocalTime.of ( Integer.parseInt ( parts[ 3 ] ) , Integer.parseInt ( parts[ 4 ] ) , Integer.parseInt ( parts[ 5 ] ) );
LocalDateTime ldt = LocalDateTime.of ( ld , lt );

ldt.toString() = 2015-03-31T17:00:01

顺便说一下,这定义了一个时刻,也没有确定时间轴上的一个点。为此,您需要时区的上下文来解释日期和时间。

ZoneId z = ZoneId.of ( "Pacific/Auckland" );  // NOT a moment.
ZonedDateTime zdt = ldt.atZone ( z );  // Now we have determined a moment.

zdt.toString() = 2015-03-31T17:00:01+13:00[太平洋/奥克兰]

© www.soinside.com 2019 - 2024. All rights reserved.