这是我的代码:
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
public static void main(String[] args) {
Calendar cal = new GregorianCalendar();
Date date = new Date(System.currentTimeMillis());
cal.setTime( date );
if (Calendar.MINUTE < 40) {
if (Calendar.HOUR_OF_DAY == 0) {
cal.add(Calendar.DAY_OF_MONTH, -1);
cal.set(Calendar.HOUR_OF_DAY, 23);
}
else
cal.add(Calendar.HOUR_OF_DAY, -1);
}
int z = cal.get(Calendar.DAY_OF_MONTH);
int w = cal.get(Calendar.HOUR_OF_DAY);
SimpleDateFormat sdf_nowbasedate = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat sdf_nowbasetime = new SimpleDateFormat("HH");
String baseDate_now = sdf_nowbasedate.format(z);
String baseTime_now = sdf_nowbasetime.format(w)+ "00";
System.out.println(baseDate_now + " " + baseTime_now);
我期待的结果是“20180606 1200”(因为现在写这篇文章的时间是2018年6月6日下午1点12分(KST - 我住在韩国)
但结果是“19700101 0900”
为什么会发生此错误?
答案 0 :(得分:1)
int z = cal.get(Calendar.DAY_OF_MONTH);
int w = cal.get(Calendar.HOUR_OF_DAY);
SimpleDateFormat sdf_nowbasedate = new SimpleDateFormat("yyyyMMdd");
String baseDate_now = sdf_nowbasedate.format(z);
首先,这段代码甚至无法编译。没有将整数作为参数的格式函数。需要约会。但是假设你实际上以某种方式从这个数字中取出了一个日期 - 这将使你的约会时间基本上比传统时间晚几十几毫秒,即1970年1月1日。
相反,请将日期直接传递给格式化。
答案 1 :(得分:0)
您必须将Date
传递给sdf_nowbasedate.format(Date)
而不是int(“z”或“w”)
当您使用日历时,您必须获得日期
String baseDate_now = sdf_nowbasedate.format(cal.getTime());
String baseTime_now = sdf_nowbasetime.format(cal.getTime())+ "00";
答案 2 :(得分:0)
其他答案已正确解释了为什么您的代码为您提供了1970年1月1日的日期。我想提供代码的现代正确版本。我想你是在追求这样的事情:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMdd HHmm");
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
if (zdt.getMinute() < 40) {
zdt = zdt.minusHours(1);
}
ZonedDateTime wholeHours = zdt.truncatedTo(ChronoUnit.HOURS);
String baseNow = wholeHours.format(formatter);
System.out.println(baseNow);
刚刚运行(韩国00:52)它打印出来了:
20180607 0000
我正在使用现代Java日期和时间API java.time
,因为Calendar
,GregorianCalendar
,Date
和SimpleDateFormat
都已过时且效果不佳设计和java.time
使用起来更好。
您的代码中似乎还有其他错误。 Calendar.MINUTE
和Calendar.HOUR_OF_DAY
是值为12和11的常量,因此Calendar.MINUTE < 40
将始终为真,而Calendar.HOUR_OF_DAY == 0
将永远不会。相反,你可能打算cal.get(Calendar.MINUTE)
,同样适用于一天中的小时。要学习的经验教训:使用旧课程很容易犯错误,有些也会被忽视,有些则难以查明。我建议你避免这些课程。
是的,java.time
适用于较旧和较新的Android设备。它只需要至少Java 6 。
org.threeten.bp
导入日期和时间类。java.time
。java.time
。java.time
向Java 6和7的后端(JST-310的ThreeTen)。