当前位置: 首页 > 知识库问答 >
问题:

将日期转换为时间戳返回错误的日期

鲁景山
2023-03-14

我有以下应该返回时间戳的函数。当使用以下斜杠以字符串格式输入日期时,此代码有效:“2019/3/4”,但在使用new Date(年、月、日)时不正常工作。

import java.util.Date;

public static Long dateToTimestamp(Date date) {
        return date == null ? null : date.getTime();
}
dateToTimestamp(new Date(2019, 3, 4) ---> 61512498000000 or, when converted, Friday, April 4, 3919 5:00:00 AM

怎么回事?

共有3个答案

路和悌
2023-03-14

遵循Date方法的JavaDoc。它指出第一个参数年份的值应该是

年份减去1900

因此,调用dateToTimestamp方法的正确版本应该是

dateToTimestamp(新日期(119,3,4)

这将为您提供1554316200000。转换后的日期为2019年4月4日。

请注意,月份的值从1月的0开始,2月的1开始,依此类推。

何玺
2023-03-14

如果您想获得UTC中显示的当天的第一个时刻,请将其转换为自1970-01-01T00:00Z以来的毫秒计数:

LocalDate             // Represent a date, without time-of-day and without time zone.  
.of( 2019 , 3 , 4 )   // Determine a date. Uses sane numbering, 1-12 for January-December.
.atStartOfDay(        // Determine first moment of the day.
    ZoneOffset.UTC    // Get the first moment as seen at UTC (an offset of zero hours-minutes-days.
)                     // Returns a `ZonedDateTime` object.
.toInstant()          // Convert from a `ZonedDateTime` to a simple `Instant` object, which is always in UTC, and has methods to get count-from-epoch.
.toEpochMilli()       // Get a count of milliseconds since the epoch reference of first moment of 1970 to UTC.

您正在使用多年前被JSR 310中定义的现代java.time类所取代的可怕的日期时间类。

要获取自UTC中1970年第一个时刻的纪元引用1970-01-01T00:00Z以来的毫秒或整秒计数,请使用Instant

long millis = Instant.now().toEpochMilli() ;

或者:

long seconds = Instant.now().getEpochSecond() ;

对于约会,您必须确定该日期当天的第一个时刻。这并不总是00:00的时间,所以让java.time确定那个时刻。这样做需要一个时区。东方的一天比西方的一天开始得早,因时区而异。

LocalDate ld = LocalDate.of( 2019 , 3 , 4 ) ;
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
long millis = Instant.now().toEpochMilli() ;

爪哇。时间框架内置于Java8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,比如java。util。日期日历

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR 310。

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

你可以交换java。时间对象直接与数据库连接。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java。sql* 类。

在哪里可以获得java。时间课?

  • JavaSE8、JavaSE9、JavaSE10、JavaSE11及更高版本——标准JavaAPI的一部分,带有捆绑实现。
  • 大部分的java应用程序。时间功能被重新移植到Java 6
  • 更高版本的Android捆绑包实现了java。时间课

娄德运
2023-03-14

调用Date(int year,int month,int Date)时,参数应如下所示:

@param   year    the year minus 1900.
@param   month   the month between 0-11.
@param   date    the day of the month between 1-31.

由于已弃用Date(int年、int月、int date),您可以使用Calendar设置,如下所示来获取所需的日期

Calendar calendar = Calendar.getInstance()
calendar.set(2019, Calendar.MARCH, 4)
Long timeInMillis = calendar.timeInMillis

// timeInMillis should be 1551718624170 equivalent to Mon Mar 04 2019
 类似资料:
  • 我试图找出如何在Kotlin中将转换为,这在Java中非常简单,但我在Kotlin中找不到任何等效的。 例如:历元时间戳(1970-01-01以来的秒数)== 在Kotlin中是否有解决方案,或者我是否必须在Kotln中使用Java语法?请给我一个简单的例子来说明如何解决这个问题。提前谢谢。 这个链接不是我问题的答案

  • 问题内容: 我尝试将其转换为java.sql.Timestamp后插入,并使用以下代码段: 但是,这是给我的 有没有办法在没有毫秒的情况下获得输出? 问题答案: 您可以使用来减少毫秒数: 输出:

  • 问题内容: 我有以下整数形式的时间戳 我可以使用SQL进行转换: 如何在Java中转换它?这样它将返回值: 问题答案: 假设自1970年1月1日以来的时间(以秒为单位)。你可以试试

  • 问题内容: 我必须将linux时间戳转换为android日期。我从服务器获得此号码 我写了一个小代码段。 但这不能正确转换,这是我的结果 编辑 :通常我必须在这里 还有另一种获取正确日期的方法吗??? 问题答案: UNIX时间戳记应以毫秒为单位,因此将Long值乘以1000。因此,您的值1386889262将为1386889262000:

  • 问题内容: 我在mysql数据库中有一个timestamp变量列。尝试将Carbon时间戳转换为我可以在此处输入的内容,但仅返回Carbon对象,当我尝试使用Carbon对象的时间戳字符串时,它未在mysql中注册。 我的第一个var dump就像这样: 我的第二个var dump就是这样。 与“ published_at”有关的mysql列是一个时间戳变量。我想如何将其从Carbon对象转换为?

  • 问题内容: 我想将日期转换为时间戳,我的输入是。我用了 上面写着NaN ..有人能告诉你如何转换吗? 问题答案: var myDate = “26-02-2012”; myDate = myDate.split(“-“); var newDate = myDate[1]+”,”+myDate[0]+”,”+myDate[2]; console.log(new Date(newDate).getTi