我有 2 个字符串
- 2012-06-25 15:02:22.948
- +0530
我需要一个新字符串,它将 5:30 添加到第一个字符串中的时间。
我想我可以通过将两个字符串都转换为日期对象然后添加来做到这一点。但我不知道该怎么做,就像我使用时一样
yyyy MM dd hh:mm:ss 作为第一个字符串的日期格式,我得到一个错误。
谢谢!
字符串的格式2012-06-25 15:02:22.948
不是yyyy MM dd hh:mm:ss
,因此出现“错误”也就不足为奇了(这是什么错误?越具体,人们就能更好地帮助您!)。
试试yyyy-MM-dd HH:mm:ss.SSS
。请参阅API 文档SimpleDateFormat
以了解格式字符串的确切语法。
注意:大写和小写在格式字符串中很重要。hh
表示 12 小时制,HH
表示 24 小时制。如果您使用,则无法hh
解析小时数。15
您也没有SSS
在格式字符串中包含毫秒。
您可以合并您的字符串 String1+string2 并且可以使用格式yyyy-MM-dd HH:mm:ss.SSSZ
来解析日期。您可以在此处查看更多文档
尝试这个:
DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
Date date = format.parse("2012-06-25 15:02:22.948");
Calendar calendar = new GregorianCalendar();
calendar.setTimeInMillis(date.getTime());
int time = Integer.parseInt("0530");
int hour = time / 100;
int minute = time % 100;
calendar.add(Calendar.HOUR_OF_DAY, hour);
calendar.add(Calendar.MINUTE, minute);
String newDateInString = format.format(calendar.getTime());
其他答案是正确的,但已过时。
与 Java 的最早版本捆绑在一起的旧日期时间类(java.util.Date/.Calendar 等)现在是遗留的。
那些旧类已被java.time包所取代。请参阅Oracle 教程。大部分功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在ThreeTenABP中进一步适应 Android 。
LocalDateTime
该类LocalDateTime
表示没有时区的日期时间。将它们用于第一件。
您的格式接近标准ISO 8601格式,只需将 SPACE 替换为T
.
String input = "2012-06-25 15:02:22.948";
String inputStandardized = input.replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( inputStandardized );
另一部分是offset-from-UTC。我们为此使用ZoneOffset
该类。
ZoneOffset offset = ZoneOffset.of( "+0530" );
如果没有偏移或时区,LocalDateTime
则不是时间线上的实际时刻,而是关于可能时刻的粗略想法。现在我们添加您的从 UTC 偏移量OffsetDateTime
来标记一个由类表示的实际时刻。
OffsetDateTime odt = OffsetDateTime.of( ldt , offset );
时区是一个偏移量加上处理异常的规则,例如夏令时 (DST)。所以最好使用时区而不是仅仅使用偏移量。
例如,如果已知此数据的上下文是India的时间,请使用时区,例如Asia/Kolkata
获取ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = odt.atZoneSameInstant( zoneId );