Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java将unix历元转换为人类可读的日期不正确_Java_Android_Epoch - Fatal编程技术网

使用Java将unix历元转换为人类可读的日期不正确

使用Java将unix历元转换为人类可读的日期不正确,java,android,epoch,Java,Android,Epoch,编辑:删除了“*1000”,但仍然得到不正确的日期,但更新了下面的日志以显示我现在得到的信息 下面是我的代码片段和日志,我认为我正确地实现了它,所以我不知道为什么它没有给我正确的转换: NewFoodItem foodItem = data.get(position); String date = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new java.util.Date (foodItem.date)); St

编辑:删除了“*1000”,但仍然得到不正确的日期,但更新了下面的日志以显示我现在得到的信息

下面是我的代码片段和日志,我认为我正确地实现了它,所以我不知道为什么它没有给我正确的转换:

NewFoodItem foodItem = data.get(position);
String date = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new java.util.Date (foodItem.date));
String a =  Integer.toString(foodItem.date);
Log.d("returnedDate:", a);
Log.d("formattedDate:", date);
它不允许我发布图像,但日志如下所示:

D/returnedDate:  1409012824
D/formattedDate: 01/17/1970 02:23:32
D/returnedDate:  1409013004
D/formattedDate: 01/17/1970 02:23:33

我只是用一些假设进行了测试,似乎问题与整数溢出有关

我假设您将
NewFoodItem.date
定义为
int
,而不是
long
。因此,当您乘以
日期*1000
(两者都是
int
)时,它返回
int

int d = 1409012824; // foodItem.date
int d1000 = d * 1000; // returns 263550912 because of overflow, instead of 1409012824000

String date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    .format(new Date(d1000)); // returns 01/04/1970 08:42:30
当我尝试将其中一个更改为
long
时,它的行为与预期的一样

// case 1
long d = 1409012824;
long d1000 = d * 1000; // now returns 1409012824000 correctly

String date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    .format(new Date(d1000)); // returns 08/26/2014 08:27:04

// case 2
int d = 1409012824;
long d1000 = d * 1000L; // note the "L" suffix to indicate the number as long 
long d1000f = d * 1000; // FAIL, still returns 263550912 because of integer overflow

String date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    .format(new Date(d1000)); // returns 08/26/2014 08:27:04
String date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    .format(new Date(d1000f)); // returns 01/04/1970 08:42:30

通常,在Java中使用
Date
时,我们将它们定义为
long
,因为它们通常以毫秒为单位。为便于维护,最好将
NewFoodItem.date
的类型更改为
long
;如果以毫秒为单位,效果会更好。

我刚刚用一些假设进行了测试,似乎问题与整数溢出有关

我假设您将
NewFoodItem.date
定义为
int
,而不是
long
。因此,当您乘以
日期*1000
(两者都是
int
)时,它返回
int

int d = 1409012824; // foodItem.date
int d1000 = d * 1000; // returns 263550912 because of overflow, instead of 1409012824000

String date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    .format(new Date(d1000)); // returns 01/04/1970 08:42:30
当我尝试将其中一个更改为
long
时,它的行为与预期的一样

// case 1
long d = 1409012824;
long d1000 = d * 1000; // now returns 1409012824000 correctly

String date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    .format(new Date(d1000)); // returns 08/26/2014 08:27:04

// case 2
int d = 1409012824;
long d1000 = d * 1000L; // note the "L" suffix to indicate the number as long 
long d1000f = d * 1000; // FAIL, still returns 263550912 because of integer overflow

String date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    .format(new Date(d1000)); // returns 08/26/2014 08:27:04
String date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    .format(new Date(d1000f)); // returns 01/04/1970 08:42:30
通常,在Java中使用
Date
时,我们将它们定义为
long
,因为它们通常以毫秒为单位。为便于维护,最好将
NewFoodItem.date
的类型更改为
long
;如果以毫秒为单位则更好。

正确:整数溢出。但是示例代码现在已经过时了

java.time 现代方法使用java.time类

Instant
类表示一个时刻。与
java.util.Date
类似,
Instant
从UTC 1970年的第一个时刻开始计数,1970-01-01T00:00Z。但是,
Instant
使用纳秒而不是毫秒的更精细分辨率

L
附加到数值文字的末尾,以指示
long
类型。在您想要分组数字的任何地方使用下划线,不添加任何含义(编译器忽略)

以标准格式生成值的文本表示形式

2014-08-26T00:27:04Z

要更灵活地生成文本,请转换为
OffsetDateTime

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
使用一个命令自动本地化输出

2014年8月26日上午12:27:04

看这个



关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android(来说,正确的答案是:整数溢出。但是示例代码现在已经过时了

      java.time 现代方法使用java.time类

      Instant
      类表示一个时刻。与
      java.util.Date
      类似,
      Instant
      从1970年的第一个时刻开始计数(UTC,1970-01-01T00:00Z)。但是
      Instant
      使用了纳秒而非毫秒的更精细分辨率

      在数字文字的末尾添加一个
      L
      ,以指示
      long
      类型。在您希望分组数字的任何位置使用下划线,不添加任何含义(编译器忽略)

      以标准格式生成值的文本表示形式

      2014-08-26T00:27:04Z

      要更灵活地生成文本,请转换为
      OffsetDateTime

      OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
      
      使用一个命令自动本地化输出

      2014年8月26日上午12:27:04

      看这个



      关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&

      要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为

      该项目现已启动,建议迁移到类

      您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
      java.sql.*
      classes

      从哪里获得java.time类

      • 、和更高版本-标准Java API的一部分,带有捆绑实现。
        • Java9添加了一些次要功能和修复
        • 大多数java.time功能都在中向后移植到Java6和Java7
        • 更高版本的Android捆绑包实现了java.time类

        • 对于早期的Android(为什么要将
          日期*1000
          相乘?@arielnmz,因为我假设
          返回的日期是秒。是的,秒,而不是毫秒。你需要*1000从秒转换为毫秒。但是所有的算术运算都需要长,否则会溢出int结果并得到奇数格式的日期。为什么要将 日期*1000
          ?@arielnmz因为
          r