Java 为什么今天格式化’;安卓工作室的日期是19700101?
这是我的密码:Java 为什么今天格式化’;安卓工作室的日期是19700101?,java,android,date,calendar,simpledateformat,Java,Android,Date,Calendar,Simpledateformat,这是我的密码: 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 G
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);
import java.util.Date;
导入java.text.simpleDataFormat;
导入java.util.GregorianCalendar;
导入java.util.Calendar;
公共类MainActivity扩展了AppCompatActivity{
公共静态void main(字符串[]args){
Calendar cal=新的Gregorianalendar();
日期日期=新日期(System.currentTimeMillis());
校准设定时间(日期);
如果(日历分钟<40){
如果(日历时数=0){
cal.add(日历日/月日,-1);
校准设置(日历小时/天,23);
}
其他的
计算添加(日历小时/天,-1);
}
int z=cal.get(日历日期,每月的第天);
int w=cal.get(日历小时);
SimpleDataFormat sdf_nowbasedate=新的SimpleDataFormat(“yyyyMMdd”);
SimpleDataFormat sdf_nowbasetime=新SimpleDataFormat(“HH”);
字符串baseDate\u now=sdf\u nowbasedate.format(z);
字符串baseTime\u now=sdf\u nowbasetime.format(w)+“00”;
System.out.println(baseDate\u now+“”+baseTime\u now);
我期望的结果是“20180606 1200”(因为现在写这篇文章的时间是2018年6月6日下午1:12(KST-我住在韩国)
但结果是“19700101 0900”
为什么会发生这种错误
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日)晚几十毫秒
相反,将日期直接传递到格式中。您必须将
日期传递到sdf\u nowbasedate。格式(日期)
而不是int(“z”或“w”)
当您使用日历时,必须获取日期
String baseDate_now = sdf_nowbasedate.format(cal.getTime());
String baseTime_now = sdf_nowbasetime.format(cal.getTime())+ "00";
java.time
其他答案正确地解释了为什么您的代码将日期定为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);
DateTimeFormatter formatter=DateTimeFormatter.of模式(“uuummdd HHmm”);
ZonedDateTime zdt=ZonedDateTime.now(亚洲/首尔地区);
if(zdt.getMinute()<40){
zdt=zdt.小时数(1);
}
ZonedDateTime wholeHours=zdt.truncatedTo(ChronoUnit.HOURS);
字符串baseNow=wholeHours.format(格式化程序);
System.out.println(baseNow);
刚刚运行这个(韩国00:52),它打印了:
20180607 0000
我使用的是java.time
,现代java日期和时间API,因为Calendar
、gregoriacalendar
、date
和SimpleDateFormat
都早已过时,设计拙劣,而且java.time
更适合使用
您的代码中似乎存在另一个错误。Calendar.MINUTE
和Calendar.HOUR\u OF_DAY
是值为12和11的常量,因此Calendar.MINUTE<40
将始终为真,而Calendar.HOUR\u OF_OF_DAY==0
将永远不会为真。相反,您可能希望Calendar.MINUTE
一天中的几个小时也是如此。要吸取的教训是:对于旧类,很容易出错,有些错误会被忽略,有些错误很难确定。我建议您避免使用这些类
问题:我可以在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为三十)
你调试过if-else条件吗?我建议你避免使用
SimpleDateFormat
类。它不仅过时很久,而且非常麻烦。Date
和Calendar
也过时了。今天我们有了更好的。顺便说一句,假设你的代码没有问题总是很危险的。F由于java.text.DateFormat
/java.text.format
超类中有format(Object)
,因此它可以编译并生成此结果,该超类从历元值开始将任何数字
作为毫秒。