【发布时间】:2011-04-17 01:25:26
【问题描述】:
我要转换:
2010-03-15T16:34:46Z
变成“5 小时前”之类的内容
如何在 Java 中做到这一点?
【问题讨论】:
-
你愿意使用JodaTime吗?有关示例,请参阅this answer。使用标准
java.util.CalendarAPI 这样做只会导致冗长的代码和令人头疼的问题。
标签: java datetime date date-format
我要转换:
2010-03-15T16:34:46Z
变成“5 小时前”之类的内容
如何在 Java 中做到这一点?
【问题讨论】:
java.util.Calendar API 这样做只会导致冗长的代码和令人头疼的问题。
标签: java datetime date date-format
JodaTime 支持从用户定义的格式进行解析。请参阅 DateTimeFormatterBuilder 和 DateTimeBuilder.parseDateTime()。
一旦有了 DateTime,您就可以根据该时间和当前时间创建 Duration 或 Period,并使用另一个格式化程序进行漂亮打印。 [参见上面 cmets 中 BalusC 引用的 PeriodFormatter 示例。]
【讨论】:
我知道 Jquery 中有一个插件:http://plugins.jquery.com/project/CuteTime
对于 Java,我假设你需要动用你的大脑 :)(你可以将它翻译成 Java)
【讨论】:
Calendar calendar = new GregorianCalendar(2010,Calendar.March,15, 16,34,46);
calendar.add(Calendar.HOUR,-5);
【讨论】:
Duration.between(
Instant.parse( "2010-03-15T16:34:46Z" ) ,
Instant.now()
)
.toHours() // returns a `long` integer number.
+ " hours ago"
5 小时前
现代方法使用 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.
您可能会发现Duration::toString 生成的ISO 8601 compliant string for durations 很有用:PnYnMnDTnHnMnS
P 标志着开始。 T 将任何年-月-日与任何小时-分钟-秒分开。
所以我们上面五个小时的例子是:
PT5H
这样的字符串可以解析成Duration小时。
Duration d = Duration.parse( "PT5H" ) ;
【讨论】:
Duration::toHours。更有可能的是,您需要 24 小时通用天数、小时数、分钟数,甚至秒数。如果是这样,在这种情况下,按照我在答案中提到的那样做,为每个部分调用 to…Part 方法。我将修改文本以使这一点更清楚。感谢您的提问。