【问题标题】:How can I convert this date in Java?如何在 Java 中转换此日期?
【发布时间】:2011-04-17 01:25:26
【问题描述】:

我要转换:

2010-03-15T16:34:46Z

变成“5 小时前”之类的内容

如何在 Java 中做到这一点?

【问题讨论】:

  • 你愿意使用JodaTime吗?有关示例,请参阅this answer。使用标准 java.util.Calendar API 这样做只会导致冗长的代码和令人头疼的问题。

标签: java datetime date date-format


【解决方案1】:

JodaTime 支持从用户定义的格式进行解析。请参阅 DateTimeFormatterBuilder 和 DateTimeBuilder.parseDateTime()。

一旦有了 DateTime,您就可以根据该时间和当前时间创建 Duration 或 Period,并使用另一个格式化程序进行漂亮打印。 [参见上面 cmets 中 BalusC 引用的 PeriodFormatter 示例。]

【讨论】:

  • Joda-Time 项目现在处于维护模式,团队建议迁移到 Java 8 及更高版本中内置的 java.time 类。
【解决方案2】:

我知道 Jquery 中有一个插件:http://plugins.jquery.com/project/CuteTime

对于 Java,我假设你需要动用你的大脑 :)(你可以将它翻译成 Java)

【讨论】:

    【解决方案3】:
         Calendar calendar = new GregorianCalendar(2010,Calendar.March,15, 16,34,46);
         calendar.add(Calendar.HOUR,-5);
    

    【讨论】:

    • 你误解了这个问题。
    【解决方案4】:

    tl;博士

    Duration.between(
        Instant.parse( "2010-03-15T16:34:46Z" ) , 
        Instant.now() 
    )     
    .toHours()    // returns a `long` integer number. 
    + " hours ago"
    

    5 小时前

    java.time

    现代方法使用 java.time 类来代替麻烦的旧旧日期时间类。

    Instant

    解析您的输入字符串。该字符串使用 ISO 8601 标准中定义的格式。 java.time 类在解析/生成字符串时默认使用这些标准格式。所以不需要指定格式模式。

    Instant instant = Instant.parse( "2010-03-15T16:34:46Z" ) ;
    

    稍后再看。

    Instant later = instant.now() ;  // Capture the current moment in UTC.
    

    让我们在五小时后稍等片刻。

    Instant later = instant.plus( 5L , ChronoUnit.HOURS ) ;
    

    Duration

    Duration 类表示经过的时间(小时-分钟-秒)。

    Duration d = Duration.between( instant , later ) ;
    

    如果您想将整个经过的时间报告为一个很大的小时数,请致电Duration::toHours

    String output = d.toHoursPart() + " hours ago" ;
    

    5 小时前

    在 Java 9 及更高版本中,调用 to…Part 以获取天、小时、分钟、秒、纳秒的各个部分。 Java 8 中奇怪地缺少这些方法,但在 Java 9 及更高版本中添加了这些方法。

    long daysPart = d.toDaysPart() ;
    int hoursPart = d.toHoursPart() ;
    int minutesPart = d.toMinutesPart() ;
    String output = … ;  // Use the parts to generate your output.
    

    ISO 8601 持续时间

    您可能会发现Duration::toString 生成的ISO 8601 compliant string for durations 很有用:PnYnMnDTnHnMnS

    P 标志着开始。 T 将任何年-月-日与任何小时-分钟-秒分开。

    所以我们上面五个小时的例子是:

    PT5H

    这样的字符串可以解析成Duration小时。

    Duration d = Duration.parse( "PT5H" ) ;
    

    【讨论】:

    • 很好,谢谢! toHoursPart 应该只是 toHours 吗?
    • @LouMorda 如果您希望整个持续时间为一个很大的小时数,请致电Duration::toHours。更有可能的是,您需要 24 小时通用天数、小时数、分钟数,甚至秒数。如果是这样,在这种情况下,按照我在答案中提到的那样做,为每个部分调用 to…Part 方法。我将修改文本以使这一点更清楚。感谢您的提问。
    猜你喜欢
    • 2011-12-12
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2011-06-02
    • 2012-08-12
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多