编辑:删除了' * 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
答案 0 :(得分:2)
Answer by Andrew T.是正确的:整数溢出。但是示例代码现已过时。
现代方法使用 java.time 类。
Instant
类代表一个时刻。像java.util.Date
一样,Instant
从1970年1月1日UTC 1970-01-01T00:00Z的epoch reference开始计数。但是Instant
使用的是纳秒级而不是毫秒级的更好分辨率。
在数字文字的末尾附加一个L
以指示long
类型。在您希望对数字进行分组的任何地方都使用下划线,并且不添加任何含义(编译器会忽略)。
long input = 1_409_012_824L ;
Instant instant = Instant.ofEpochSecond( input ) ;
生成标准ISO 8601格式的值的文本表示形式。
String output = instant.toString() ;
2014-08-26T00:27:04Z
要在生成文本时更加灵活,请转换为OffsetDateTime
。
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
使用DateTimeFormatter
自动定位输出。
Locale locale = Locale.US ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( locale ) ;
String output2 = odt.format( f ) ;
2014年8月26日,上午12:27:04
请参阅此code run live at IdeOne.com。
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:1)
我刚刚测试了一些假设,似乎问题与整数溢出有关。
我假设您将NewFoodItem.date
定义为int
,而不是long
。因此,当您将date * 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
是首选;如果它在毫秒内也好得多。