Java 从millis获取字符串日期,API级别为15,区域设置正确,时间为24小时

Java 从millis获取字符串日期,API级别为15,区域设置正确,时间为24小时,java,android,date,Java,Android,Date,我使用以下整数在sqlite db中存储了一个日期: System.currentTimeMillis() 现在我要把它放回一个很长很长的时间,然后再继续: myTextView.setText(convertDate(date_in_millis.toString(),"dd/MM/yyyy hh:mm:ss"); 使用此函数 public static String convertDate(String dateInMilliseconds, String dateFormat)

我使用以下整数在sqlite db中存储了一个日期:

System.currentTimeMillis()
现在我要把它放回一个很长很长的时间,然后再继续:

myTextView.setText(convertDate(date_in_millis.toString(),"dd/MM/yyyy hh:mm:ss");
使用此函数

    public static String convertDate(String dateInMilliseconds, String dateFormat) {
    return DateFormat.format(dateFormat, Long.parseLong(dateInMilliseconds)).toString();
}
我在意大利

首先,我在某处损失了几小时和几分钟

第二,我无法设置24小时(用HH代替HH)


我需要使用API级别15,然后我不能使用API 24库,我不能使用我找到的大多数答案

尝试使用
日历
类:

public static String convertDate(String dateInMilliseconds, String dateFormat) {
DateFormat df = new SimpleDateFormat(dateFormat);
Calendar c = Calendar.getInstance();
c.setTimeInMillis(Long.parseLong(dateInMilliseconds));
c.add(Calendar.HOUR_OF_DAY, 1); //Work-around to get your lost hour
return df.format(c.getTime());
}
您可以使用HH获得24小时的tl;博士 2017年02月06日10:37:07

避免遗留日期时间类 这个问题和其他答案都过时了。现在,诸如、和
java.text.SimpleTextFormat
等麻烦的旧日期时间类已被这些类所取代

大部分java.time功能都在中向后移植到Java6和Java7,并在中进一步适应Android

将库添加到您的Android项目是非常值得的。遗留的日期时间类一团糟;避免它们会让你省去很多悲伤

使用java.time 将表示自1970-01-01-T00:00:00Z的历元参考日期起毫秒数的整数转换为
即时
,而不是
日期
日历
。打电话

该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

调用
toString
生成表示日期时间值的字符串

instant.toString():2017-02-06T00:07:27.879Z

要通过一个区域的镜头看到同一时刻,请应用时区获得一个时间

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

zdt.toString():

您可以获得JVM的。如果关键,应要求用户确认。请注意,与
Locale
一样,JVM中任何应用程序的任何线程中的任何代码都可以随时更改当前默认值,即使在运行时也是如此

ZoneId z = ZoneId.systemDefault();
要生成其他格式的字符串,可以让java.time自动本地化。要本地化,请指定:

  • 确定字符串的长度或缩写
  • 确定(a)用于翻译日名、月名等的人类语言,以及(b)决定缩写、大写、标点符号、分隔符等问题的文化规范
您可以请求JVM的当前默认
语言环境
。如果关键,应与用户确认

Locale locale = Locale.getDefault();
请注意,区域设置与时区无关,完全是正交的问题,相互独立。时区决定挂钟的时间。Locale仅适用于生成向用户演示的字符串。您可以使用芬兰地区在
太平洋/奥克兰
时区中显示日期时间,或者使用泰国地区在
欧洲/罗马
中显示日期时间。这个问题的标题使用了“地区”一词,但显然是“时区”的意思

示例代码。在这个具有这种特定格式模式的特定示例中,我们在技术上不需要指定
区域设置
。但是最好养成一个习惯,总是指定一个
Locale
。如果忘记指定,则隐式地依赖JVM的当前默认区域设置,该区域设置在运行时的任何时刻都可能更改

Locale l = Locale.ITALY ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT ).withLocale( l ) ;
String output = zdt.format( f );
也可以指定格式模式

DateTimeFormatter fCustom = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" ).withLocale( l ) ;
String output2 = zdt.format( fCustom );
参见示例代码

米利斯:1486373827327

instant.toString():2017-02-06T09:37:07.327Z

zdt.toString():2017-02-06T10:37:07.327+01:00[欧洲/罗马]

产出:2017年6月2日10.37

输出2:06/02/2017 10:37:07

无需将数字转换为字符串 我认为没有必要将计数从历元长度的整数转换为字符串。如果您有
long
long
,只需传递
long
long
。转换为
字符串,然后再转换为
字符串,不会增加任何值


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

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

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

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

我太蠢了,sry,“导入java.text.simpleDataFormat;”不需要24级。我在试…罗萨里奥,是的,你的代码可以用。不管怎样,我只损失了一个小时。我想这是因为我有一个不同的UTC。我有一个解决方案。检查我的更新答案我还尝试使用Calendar.getInstance(TimeZone.getTimeZone(“UTC”)).getTimeInMillis()保存日期。我甚至损失了一个小时。(意大利是GMT+1)有什么想法吗?谢谢,我接受了答案,因为我的应用程序正在按我的需要运行。无论如何,我需要找到一种方法来更新任何时区的小时数。非常感谢您的帮助。请始终尝试存储和获取UTC时间。在检索侧移动时区亲爱的Down投票者:请在投票时留下批评意见。与其使用此JDK中提供的标准库,不如建议明天支持或不支持某些第三方库,这是值得怀疑的。虽然我们都应该使用JDK 8,但这并不总是一个选项。而
Locale locale = Locale.getDefault();
Locale l = Locale.ITALY ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT ).withLocale( l ) ;
String output = zdt.format( f );
DateTimeFormatter fCustom = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" ).withLocale( l ) ;
String output2 = zdt.format( fCustom );