自1970年1月1日UTC(大纪元时间)以来,我有几毫秒。
1512431637067
我需要将其转换为类似(ISO-8601持续时间)。这将基于今天的当前日期。
P5M4D
任何想法如何使用java代码以简单的方式做到这一点?
答案 0 :(得分:3)
ZoneId zone = ZoneId.of("Europe/Guernsey"); // Specify a time zone by proper name `Contintent/Region`, never by 3-4 letter codes such as `PST`, `CST`, or `IST`.
LocalDate then = // Represent a date-only value, without time zone and without time-of-day.
Instant.ofEpochMilli(1_512_431_637_067L) // Parse your number of milliseconds since 1970-01-01T00:00Z as a value in UTC.
.atZone(zone) // Adjust from UTC to some other zone. Same moment, different wall-clock time. Returns a `ZonedDateTime`.
.toLocalDate(); // Extract a date-only value.
LocalDate today = LocalDate.now(zone); // Get the current date as seen in the wall-clock time in use by the people of a particular region.
Period diff = Period.between(then, today); // Determine the number of years-months-days elapsed.
System.out.println(diff); // Generate a String is standard ISO 8601 format: `PnYnMnDTnHnMnS`.
刚刚运行时的输出正是您所要求的:
P5M4D
结果取决于时区。对于任何特定时刻,日期在全球范围内因地区而异。
因此,如果不是Europe/Guernsey
,请替换您所需的时区。如果您希望在ZoneOffset.UTC
中进行计算,请使用OffsetDateTime
和UTC课。
例如,为Europe/Guernsey
运行上面的代码会导致P5M4D,而切换到Europe/Moscow
会产生P5M3D,相差一天,具体取决于您指定的区域。
Period.between(then, LocalDate.now(ZoneId.of("Europe/Moscow")))
提出问题当天的输出是:
P5M3D
对于包含大于一天的单位的持续时间,您需要使用java.time
类 ...............................
@Injectable()
export class ApiBaseService {
...............................
constructor(url : string, _logger : LoggerService) {
...............................
}
...............................
Period
类适用于较小的单位,日 - 小时 - 分 - 秒 - 毫微秒。
答案 1 :(得分:1)
严格地说,你不能因为所谓的'#ep;时代"真的是一个瞬间,而不是一个持续时间。但您可能希望将该时期(Unix纪元)以来的经过时间建模为持续时间。所以你走了:
System.out.println(Duration.of(1512431637067L, ChronoUnit.MILLIS));
// output: PT420119H53M57.067S
方法java.time.Duration.toString()
自动将秒和纳秒标准化为HMS格式(否则我们必须声明新持续时间类的打印功能是有限的)。如果您希望更多地控制ISO格式,请使用toHours()
等方法考虑自己的解决方法,或使用第三方库进行持续时间打印。
另一件事:1512431637067似乎是以毫秒为单位,而不是几秒钟,因为你声明否则你会在不久的将来得到一个瞬间:
System.out.println(Instant.ofEpochMilli(1512431637067L));
// output: 2017-12-04T23:53:57.067Z
System.out.println(Instant.ofEpochSecond(1512431637067L));
// far future: +49897-01-18T19:11:07Z
答案 2 :(得分:0)
试试这一行
11As7737Cs9ue9oo09
iso 8601上的输出日期:
import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.util.Locale;
public class HelloWorld
{
public static void main(String[] args)
{
Date date=new Date (1512431637067L);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX", Locale.US);
System.out.print(df.format(date));
}
}