如何将GoogleProto时间戳转换为JavaLocalDate?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (528)

我们需要将GoogleProto缓冲区时间戳转换为正常日期。在这种情况下,有没有办法将GoogleProto缓冲区时间戳转换为JavaLocalDate directly?

提问于
用户回答回答于

首先是一些人抬头:Protobuf的TimeStamp分辨率(秒和分数秒)比Java LocalDate(天)更高,因此您将通过转换TimeStamp为a 来丢失一些信息LocalDate

请参阅TimeStamp的JavaDoc摘录:

时间戳表示独立于任何时区或日历的时间点,表示为UTC时间段内纳秒分辨率的秒和分数秒。

这个非常相同的JavaDoc告诉我们,值是基于Epoch时间的表示,这意味着我们可以使用Java的LocalDateTime#ofEpochSeconds进行无损转换(因为LocalDateTime还存储时间)并从那里开始获取时间LocalDate

通过使用LocalDateTime(em:Local),我们可以确保使用与TimeStampClass 相同的TimeZone偏移量,即UTC(再次来自JavaDoc):

final Timestamp ts1 = Timestamp.newBuilder().setSeconds((60 * 60 * 24) - 1).build();
final Timestamp ts2 = Timestamp.newBuilder().setSeconds((60 * 60 * 24)).build();

final LocalDate ld1 = LocalDateTime.ofEpochSecond(ts1.getSeconds(), ts1.getNanos(), ZoneOffset.UTC).toLocalDate();
final LocalDate ld2 = LocalDateTime.ofEpochSecond(ts2.getSeconds(), ts2.getNanos(), ZoneOffset.UTC).toLocalDate();

System.out.println(ts1 + " = " + ld1);
System.out.println(ts2 + " = " + ld2);

产量

秒:86399 = 1970-01-01 秒:86400 = 1970-01-02

请求转换后编辑java.util.Date

查看可能的构造函数Date及其JavaDoc,我们发现:

分配Date对象并将其初始化以表示自标准基准时间(称为“epoch”)以来的指定毫秒数,即1970年1月1日00:00:00 GMT。

并且因为GMT是旧的标准分区时间表示,它基本上是UTC +/- 0,这个构造函数符合我们的需求:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
// making sure the Date objects use UTC as timezone

final Timestamp ts1 = Timestamp.newBuilder().setSeconds((60 * 60 * 24) - 1).build();
final Timestamp ts2 = Timestamp.newBuilder().setSeconds((60 * 60 * 24)).build();

final Date d1 = new Date(ts1.getSeconds() * 1000);
final Date d2 = new Date(ts2.getSeconds() * 1000);

System.out.println(ts1 + " = " + d1);
System.out.println(ts2 + " = " + d2);

输出:

秒:86399 = Thu Jan 01 23:59:59 CET 1970 秒:86400 = Fri Jan 02 00:00:00 CET 1970

用户回答回答于

String,这样它就可以多用,然后:

Timestamp timestamp;
String sDate1 = timestamp.toString();  
Date date1 = new SimpleDateFormat("dd/MM/yyyy").parse(sDate1);

如果想将其设为LocalDate,请执行以下操作:

Timestamp timestamp;
String sDate1 = timestamp.toString();    
LocalDate localDate = LocalDate.parse(sDate1);

如果无法提取字符串时间戳并且您有Miliseconds,也可以从中创建LocalDate和Date对象,因为它们都有承包商

    Timestamp timestamp;
    long timeInMilliSeconds = Timestamp.toMillis(timestamp);
    Date currentDate = new Date(timeInMilliSeconds);
    LocalDate date = Instant.ofEpochMilli(timeInMilliSeconds).atZone(ZoneId.systemDefault()).toLocalDate();

所属标签

可能回答问题的人

  • 找虫虫

    0 粉丝0 提问6 回答
  • 优惠活动秘书

    0 粉丝2 提问6 回答
  • 不吃貓的鱼oo

    5 粉丝466 提问5 回答
  • 天使的炫翼

    17 粉丝531 提问5 回答

扫码关注云+社区

领取腾讯云代金券