Java 如何将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 =

我很惊讶,考虑到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 = 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();