我正在从MSSQL服务器数据库获取datetime默认CURRENT_TIMESTAMP结果,现在我需要解析此日期,时间等。数据库结果类似于2016-05-14 12:54:01.363
我需要的是遍历此日期时间格式。正如我在下面做的那样。
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try
{
Date date = format.parse(dateStr);
SimpleDateFormat todayFormat = new SimpleDateFormat("dd");
String dateToday = todayFormat.format(date);
format = dateToday.equals(today) ? new SimpleDateFormat("hh:mm a") : new SimpleDateFormat("dd LLL, hh:mm a");
String date1 = format.format(date);
timestamp = date1.toString();
//
}
catch (ParseException e)
{
e.printStackTrace();
}
但是我收到以下错误:
java.text.ParseException: Unparseable date: "{"date":"2016-05-14 12:54:01.363000","timezone":"UTC","timezone_type":3}" (at offset 0)
在第3行。即Date date = format.parse(dateStr);
需要帮忙!
您的问题的文本将输入字符串引为,2016-05-14 12:54:01.363
但您的错误消息中则相反2016-05-14 12:54:01.363000
。那多余的三位数是微秒。
旧的日期时间类(例如java.util.Date)只能解析为毫秒(小数点后3位为秒)。因此SimpleDateFormat
无法处理此类输入。截断输入字符串,或者更好的方法是使用现代的日期时间类。
更大的问题是,您正在使用最早的Java版本中过时的过时的日期时间类。这些类已被内置在Java 8及更高版本中的java.time框架取代。ThreeTen-Backport项目已将大部分java.time功能反向移植到Java 6和7 ,并通过ThreeTenABP进一步适用于Android 。因此,没有理由与那些古老而臭名昭著的班级进行角力。
java.time类具有更精细的粒度,可解析为纳秒(秒的小数点后9位数字)。
在java.time中,Instant
类是UTC时间线上的时刻,分辨率为纳秒。“ an Instant
”等效于“ an ”,java.util.Date
但分辨率更高。
有关在旧类型和java.time类型之间进行转换的更多信息,请参阅我的带有图的答案到另一个问题。
您应该以日期时间类型而不是字符串的形式从数据库中检索日期时间值。如果您的JDBC驱动程序符合JDBC 4.2(JSR 221的更新,并在此处进行了描述),则您可以直接将其检索到中OffsetDateTime
。您可以将aOffsetDateTime
视为与UTCInstant
的偏移量(小时,分钟和秒数)。
java.time.OffsetDateTime odt = resultSet.getObject( 1 );
如果不是,则退回到使用旧的java.sql类型。对于日期时间,这表示java.sql.Timestamp
。
java.sql.Timestamp ts = resultSet.getTimestamp( 1 );
尽量减少对旧的java.sql类型的使用,因为它们是java.util.Date/.Calendar等问题的一部分。立即转换为java.time。要进行转换,请查找添加到旧类中的新方法,例如toInstant
。
Instant instant = ts.toInstant();
如果必须解析该输入字符串,最简单的方法是使其符合ISO 8601标准格式。解析/生成字符串时,java.time类默认使用ISO 8601格式。
为了符合要求,请将中间的SPACE替换为T
。并且,假设此字符串确实代表UTC的时刻,请附加一个Z
。的Z
缩写Zulu
,表示UTC。
String input = "2016-05-14 12:54:01.363000";
String inputModified = input.replace( " " , "T" );
Instant instant = Instant.parse( inputModified );
该问题忽略了时区这一至关重要的问题。
最佳做法是将日期时间值存储在UTC中。更好的数据库会将传入的数据调整为UTC。检索为java.sql.Timestamp
值时,您的值以UTC表示,转换为时也是如此Instant
。
日期和时间取决于时区。套用一个时区(ZoneId
)你Instant
得到ZonedDateTime
。
ZoneId zoneId = zoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
然后询问以获取所需的月份和时间。
int dayOfMonth = zdt.getDayOfMonth();
如果您希望将时间作为自己的对象,请使用LocalTime
该类。
LocalTime localTime = zdt.toLocalTime();
如果您确实需要时间中的字符串,请使用java.time.format包。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "hh:mm a" );
String output = zdt.format( formatter );
更好的是,让java.time完成自动格式化的工作。请注意使用语言环境,该语言环境确定(a)月份名称等人类语言,以及(b)文化规范,例如年月日等元素的排序。最好显式指定语言环境,而不是隐式依赖JVM当前默认的语言环境,后者可以在运行时更改。
DateTimeFormatter timeOfDayFormatter = DateTimeFormatter.ofLocalizedTime( FormatStyle.SHORT );
timeOfDayFormatter = timeOfDayFormatter.withLocale( Locale.CANADA_FRENCH );
String output = zdt.toLocalTime().format( timeOfDayFormatter );
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句