Java 如何将ISO8601格式转换为毫秒?
我很惊讶,考虑到JSON中使用ISO8601的频率,我还没有找到一种真正简单的方法 基本上,我取了一个如下的字符串:Java 如何将ISO8601格式转换为毫秒?,java,android,datetime,Java,Android,Datetime,我很惊讶,考虑到JSON中使用ISO8601的频率,我还没有找到一种真正简单的方法 基本上,我取了一个如下的字符串:2014-10-23T00:35:14.800Z,并将其转换为50分钟前的 首先,我必须将2014-10-23T00:35:14.800Z更改为2014-10-23'T'00:35:14.800Z,然后我需要将其转换为毫秒,这样很容易 我当前的代码: private void setTimestamp(String timeCreated) { int indexOfT =
2014-10-23T00:35:14.800Z
,并将其转换为50分钟前的
首先,我必须将2014-10-23T00:35:14.800Z
更改为2014-10-23'T'00:35:14.800Z
,然后我需要将其转换为毫秒,这样很容易
我当前的代码:
private void setTimestamp(String timeCreated) {
int indexOfT = timeCreated.indexOf('T');
String properFormat = new StringBuilder(timeCreated).insert(indexOfT + 1, "'")
.insert(indexOfT, "'")
.toString();
timeStamp = (String) DateUtils.getRelativeTimeSpanString(Long.parseLong(properFormat),
System.currentTimeMillis(),
DateUtils.SECONDS_IN_MILLIS);
}
罪魁祸首是Long.parseLong(properFormat)
。我需要将properFormat
转换为毫秒。因此,答案比我想象的要简单
private void setTimestamp(String timeCreated) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
try {
Date timeCreatedDate = dateFormat.parse(timeCreated);
timeStamp = (String) DateUtils.getRelativeTimeSpanString(timeCreatedDate.getTime(),
System.currentTimeMillis(),
DateUtils.SECONDS_IN_MILLIS);
} catch ( ParseException e) {}
}
那就行了。tl;博士
java.time中的一行程序
该框架内置于Java8及更高版本中。这些新类取代了与Java的最早版本(如Java.util.date/.Calendar)捆绑在一起的旧日期时间类。看见time类也取代了非常成功的库,它是由一些相同的人构建的,包括由相同的人领导
a是时间线上的一个时刻,分辨率为。你可以从它(1970年的第一刻)开始。但请记住,瞬间
可能会有额外的数据,纳秒比毫秒还要精细。因此,您可能会在短短的几秒钟内丢失数据
在解析/生成字符串时,java.time类使用标准ISO 8601格式。无需指定格式化模式。Instant
类可以是一个字符串
Instant.parse( "2014-10-23T00:35:14.800Z" )
通过调用toEpochMilli
请注意可能的数据丢失,因为Instant
类可以保存纳秒。因此,提取毫秒将在任何分数秒内截断任何微秒或纳秒。您的示例字符串在小数秒内只有三位数字,因此只有毫秒。但当转换为毫秒计数时,小数点后的6或9位数字将被截断为3位
long millisFromEpoch = Instant.parse( "2014-10-23T00:35:14.800Z" ).toEpochMilli();
要获取以小时分秒为单位的运行时间,请使用类。给它的方法注入一对瞬间
Duration duration = Duration.between( Instant.parse( "2014-10-23T00:35:14.800Z" ) , Instant.now() );
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*
类
从哪里获得java.time类
- 然后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(请参阅。如果您使用Java 8,您可能会觉得很有趣。请让我知道您为什么否决了此内容。@David我不是否决者。但我怀疑否决可能是因为在StackOverflow上有数百个问题和答案处理了此主题。@PM77-1没有Java 8也没有Android中的Java.time。我想我肯定会使用它。看起来像是一句简单的话为我的约会度身订造。投票人:请在投票时留下批评意见,特别是对已接受的答案。
Instant
从API 26开始在Android上可用only@rightaway717java 8中内置的java.time的大部分功能在ThreeTen Backport项目中被后移植到java 6和7中,并进一步适用于早期的Andro身份证是三张一张的。
Duration duration = Duration.between( Instant.parse( "2014-10-23T00:35:14.800Z" ) , Instant.now() );
long millisSinceEpoch = new DateTime( "2014-10-23T00:35:14.800Z" ).getMillis();