【问题标题】:Strings Dates in firebase, retrieve as miliseconds [duplicate]Firebase中的字符串日期,以毫秒为单位检索[重复]
【发布时间】:2021-01-15 20:47:55
【问题描述】:

我在firebase 中有一些dates,我需要以毫秒 的形式检索并对其进行一些操作。 日期类似于 "dd/MM/yyyy" 格式的字符串

我试过这样的代码:

String myDate = "2014/10/29 18:10:45";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = sdf.parse(myDate);
long millis = date.getTime();

我的代码,基本上我试图从 firebase 获取存储的字符串并转换为日期以与当天进行比较并显示天的差异。我遇到的错误仅在我的代码的“解析”一词中

refresh.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                           String mydate = model.getParto();
                           SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
                           Date date = sdf.parse(mydate);

                        }
                    });

解析设置错误

firebase 中的代码图像和字符串日期

希望有人可以帮忙

【问题讨论】:

  • 请包含错误。我也会推荐this
  • 删除 Firebase 标记,因为它与此处显示的代码无关。
  • 将代码显示为文本,而不是图像。
  • parse 抛出一个ParseException,你必须抓住它。但正如回答的那样,不要使用SimpleDateFormat
  • 我建议你不要使用SimpleDateFormatDate。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateTimeDateTimeFormatter

标签: java date


【解决方案1】:

tl;博士

LocalDateTime
.parse( 
    "2014/10/29 18:10:45".replace( " " , "T" ) 
)
.atOffset( ZoneOffset.UTC ) 
.toInstant()
.toEpochMilli() 

需要纪元参考

将时刻表示为毫秒数需要一个时间点作为纪元参考。您需要说明您的情况所需的参考。我将假设 UTC 中 1970 年第一时刻的常用点。但是各种系统还使用了几十个其他点。所以你需要找出你自己的数据的含义。

需要时区或偏移量

确定时刻需要的不仅仅是日期和时间。您还需要时区的上下文或与 UTC 的偏移量。同样,您需要指定但没有指定。你的例子是在日本东京、法国图卢兹还是美国俄亥俄州托莱多晚上六点十分?我将假设您的意思是零时分秒的偏移量。但同样,您需要找出自己数据的含义。

避免使用旧的日期时间类

永远不要使用 SimpleDateFormatDate 或其他可怕的日期时间类,这些类在几年前被 JSR 310 中定义的现代 java.time 类所取代。

日期与时刻

您的问题很困惑,指的是仅日期值以及以毫秒表示的日期时间。这是两种不同类型的数据。

如果表示仅日期,请在 Java 中使用 LocalDate,并在数据库中使用类似于 SQL 标准 DATE 的类型。我将忽略这个仅限日期,并专注于跟踪时刻。

示例代码

将您的输入解析为LocalDateTime,遵循标准ISO 8601 格式,将中间的空格替换为T

LocalDateTime 确实代表一个时刻,不是时间轴上的一个点。您需要找到适合您输入的区域/偏移量,然后应用。应用用于您输入的时区,以生成 ZonedDateTime。或者,如果打算使用 UTC(零偏移),则应用 ZoneOffset 以获取 OffsetDateTime 对象。至此,我们已经确定了一个时刻。

OffsetDateTime 中提取Instant 对象。询问自 1970-01-01T00:00Z 的纪元引用以来的毫秒数。

String myDate = "2014/10/29 18:10:45".replace( " " , "T" ) ;  // Comply with ISO 8601 standard formatting.
LocalDateTime ldt = LocalDateTime.parse( input ) ;
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;  // Assuming your data was intended to represent a moment as seen in UTC, with an offset of zero hours-minutes-seconds.
Instant instant = odt.toInstant() ;  // Basic building-block class in java.time, representing a moment as seen in UTC.
long millisecondsSinceEpoch1970 = instant.toEpochMilli() ;

您的标题提到了 Firebase,但这似乎与您的问题无关。所以我会忽略这个话题。

此答案中的所有内容已在 Stack Overflow 上多次介绍。搜索以了解更多信息。


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。 Hibernate 5 & JPA 2.2 支持 java.time

从哪里获取 java.time 类?

【讨论】:

    猜你喜欢
    • 2021-09-13
    • 2020-12-17
    • 1970-01-01
    • 2015-07-24
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多