Java 简单日期格式分析日期时出错
我有一个简单的日期格式的问题,我不知道为什么。 这是我的算法Java 简单日期格式分析日期时出错,java,android,datetime,simpledateformat,Java,Android,Datetime,Simpledateformat,我有一个简单的日期格式的问题,我不知道为什么。 这是我的算法 if (realtimeDeparture != null) { int hours = this.realtimeDeparture / 3600; int minutes = (this.realtimeDeparture % 3600) / 60; SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
if (realtimeDeparture != null) {
int hours = this.realtimeDeparture / 3600;
int minutes = (this.realtimeDeparture % 3600) / 60;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
try {
Calendar cal = Calendar.getInstance(Locale.FRENCH);
String date = cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH)+1)+ "-" + cal.get(Calendar.DAY_OF_MONTH)+ " " + hours+":"+minutes;
result = df.parse(date);
}
我有一个API,它在00h00(实时离开)后给我一个秒数
我想从这个整数中提取一个真实的日期对象
所以我做了这个算法,但我不知道为什么
例如,有一些输入和结果值:
date = 2018-5-7 12:26
result = Mon May 07 00:26:00 GMT+02:00 2018
我试图检查2018年5月7日是否与2018年5月7日不同,但问题相同:
date = 2018-05-07 12:26
result = Mon May 07 00:26:00 GMT+02:00 2018
如何从00h00的秒数中获取日期对象?
或者如何修复我的算法?试试这段代码
String date=" 2018-5-7 12:26";
SimpleDateFormat spf=new SimpleDateFormat("yyyy-mm-dd hh:mm");
Date newDate= null;
try {
newDate = spf.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
spf= new SimpleDateFormat("EEE MMM dd hh:mm:ss zzz yyyy", Locale.ENGLISH);
date = spf.format(newDate);
System.out.println(date);
然后对象要转换,如下面的代码所示
try {
Date dateToshow=spf.parse(date);
Log.d("Date object:",dateToshow.toString());
} catch (ParseException e) {
e.printStackTrace();
}
请尝试此代码
String date=" 2018-5-7 12:26";
SimpleDateFormat spf=new SimpleDateFormat("yyyy-mm-dd hh:mm");
Date newDate= null;
try {
newDate = spf.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
spf= new SimpleDateFormat("EEE MMM dd hh:mm:ss zzz yyyy", Locale.ENGLISH);
date = spf.format(newDate);
System.out.println(date);
然后对象要转换,如下面的代码所示
try {
Date dateToshow=spf.parse(date);
Log.d("Date object:",dateToshow.toString());
} catch (ParseException e) {
e.printStackTrace();
}
我觉得你的计算很好,所以我猜问题在于格式 你试过使用吗
cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);
然后和她约会
Date date = cal.getTime();
我觉得你的计算很好,所以我猜问题在于格式 你试过使用吗
cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);
然后和她约会
Date date = cal.getTime();
使用java.time,这是一种现代java日期和时间API,它更简单、更直接、更不容易出错:
int realtimeDeparture = 44783;
LocalTime time = LocalTime.ofSecondOfDay(realtimeDeparture);
System.out.println(time);
这张照片是:
12:26:23
如果您需要一天中某个时间的今天日期,则需要首先确定时区,例如:
ZoneId zone = ZoneId.of("Asia/Bangkok");
ZonedDateTime dateTime = LocalDate.now(zone).atTime(time).atZone(zone);
System.out.println(dateTime);
2018-05-07T12:26:23+07:00[亚洲/曼谷]
问题:为什么我需要时区?因为地球上任何地方的日期都不一样。您可以指定ZoneId.systemDefault()
以使用JVM的时区设置,而时区设置通常来自设备。但是,它可以随时从程序的另一部分或运行在同一JVM中的另一个程序进行更改
你的代码出了什么问题?
在您的格式模式字符串中,您使用小写字母hh
数小时,在您的示例中为12小时hh
表示从01到12的上午或下午的小时数。当您不指定AM或PM时,SimpleDataFormat
使用AM作为默认值。上午12:26表示午夜后26分钟,与24小时制的00:26相同。这就是SimpleDateFormat
给你的
你有点幸运,每天12小时进行测试。一天中的其他几个小时的工作,正如你所期望的,尽管你有bug。其他人也犯了同样的错误,而且很长时间都没有被注意到。作为比较,现代API在类似情况下会抛出一个异常,让您知道丢失的AM/PM标记。我显然更喜欢这种行为
问题:我可以在Android上使用java.time吗?
是的,java.time
在较旧和较新的Android设备上运行良好。它至少需要Java6
- 在Java8和更高版本以及更新的Android设备上(我听说是API级别26),现代API是内置的
- 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310;请参阅底部的链接)
- 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
导入日期和时间类org.threeten.bp
- 解释如何使用
java.time
- ,其中首先描述了
java.time
- ,java.time的后端口到Java6和Java7(JSR-310为三十)
- ,Android版Three Ten Backport
- ,解释得非常透彻
int realtimeDeparture = 44783;
LocalTime time = LocalTime.ofSecondOfDay(realtimeDeparture);
System.out.println(time);
这张照片是:
12:26:23
如果您需要一天中某个时间的今天日期,则需要首先确定时区,例如:
ZoneId zone = ZoneId.of("Asia/Bangkok");
ZonedDateTime dateTime = LocalDate.now(zone).atTime(time).atZone(zone);
System.out.println(dateTime);
2018-05-07T12:26:23+07:00[亚洲/曼谷]
问题:为什么我需要时区?因为地球上任何地方的日期都不一样。您可以指定ZoneId.systemDefault()
以使用JVM的时区设置,而时区设置通常来自设备。但是,它可以随时从程序的另一部分或运行在同一JVM中的另一个程序进行更改
你的代码出了什么问题?
在您的格式模式字符串中,您使用小写字母hh
数小时,在您的示例中为12小时hh
表示从01到12的上午或下午的小时数。当您不指定AM或PM时,SimpleDataFormat
使用AM作为默认值。上午12:26表示午夜后26分钟,与24小时制的00:26相同。这就是SimpleDateFormat
给你的
你有点幸运,每天12小时进行测试。一天中的其他几个小时的工作,正如你所期望的,尽管你有bug。其他人也犯了同样的错误,而且很长时间都没有被注意到。作为比较,现代API在类似情况下会抛出一个异常,让您知道丢失的AM/PM标记。我显然更喜欢这种行为
问题:我可以在Android上使用java.time吗?
是的,java.time
在较旧和较新的Android设备上运行良好。它至少需要Java6
- 在Java8和更高版本以及更新的Android设备上(我听说是API级别26),现代API是内置的
- 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310;请参阅底部的链接)
- 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
导入日期和时间类org.threeten.bp
- 解释如何使用
java.time
- ,其中首先描述了
java.time
- ,java.time的后端口到Java6和Java7(JSR-310为三十)
- ,Android版Three Ten Backport
- ,解释得非常透彻