Java Android Date.getTime()将原始日期增加一天
所以我有一个日历,我需要设置一个特定的日期Java Android Date.getTime()将原始日期增加一天,java,android,date,milliseconds,android-date,Java,Android,Date,Milliseconds,Android Date,所以我有一个日历,我需要设置一个特定的日期 Date date = TKDateUtils.parseDate("Jun 02, 2016 05:10:30 pm"); Calendar next = Calendar.getInstance(); next.setTime(date); 我将它们记录在这里以查看输出: Log.i("MainActivity", date.toString()); Log.i("MainActivity", date.
Date date = TKDateUtils.parseDate("Jun 02, 2016 05:10:30 pm");
Calendar next = Calendar.getInstance();
next.setTime(date);
我将它们记录在这里以查看输出:
Log.i("MainActivity", date.toString());
Log.i("MainActivity", date.getTime() + "");
输出:
06-02 20:21:29.245 1915-1915/com.cyscorpions.timekeeper I/MainActivity: Thu Jun 02 17:10:30 EDT 2016
06-02 20:21:29.245 1915-1915/com.cyscorpions.timekeeper I/MainActivity: 1464901830000
因此,我将getTime
从毫秒转换为日期,这是输出:
Log.i("MainActivity", date.toString());
Log.i("MainActivity", date.getTime() + "");
因此,日期
设置为2016年6月2日17:10:30,但getTime()
设置为该日期后的确切日期。
我做错什么了吗
以下是我如何解析日期:
public static Date parseDate(@NonNull String dateString) {
try {
mDateFormat = new SimpleDateFormat("MMM dd, yyyy h:mm:ss a");
return mDateFormat.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
问题一直在Genymotion的时区上。它被设置为与我所在位置不同的时区。指定时区 两个不同的JVM,每个JVM都有自己的(不同的)当前默认时区。在解析字符串期间,每个字符串都使用其自己的当前默认时区来解释输入数据的含义 解决方案:始终指定所需/预期的时区。 JVM的当前默认时区可以通过各种方式初始化。在运行时,JVM中任何应用程序的任何线程中的任何代码都可以更改当前默认时区。所以永远不要依赖时区的外部性 以
大陆/地区
的格式指定一个。切勿使用3-4个字母的缩写,如EDT
,IST
,CST
等。这些不是真正的时区,不是标准化的,也不是唯一的(!)
指定区域设置
同样的道理,用于解析日和月的名称,确定逗号和句点,等等。JVM当前默认的语言环境
超出了您的控制范围。因此,请始终指定适合输入数据上下文的所需/预期的语言环境
java.time
您使用的是旧的日期时间类,这些类被证明设计得很糟糕,令人困惑,而且很麻烦。避开它们
这些类内置于Java8和更高版本中。在项目中,它们的大部分功能已经被移植到Java6和Java7中,并在项目中进一步适应Android
time类是非常成功的Joda时间库的继承者,这两个项目都由同一个人领导。time类取代了与java最早版本捆绑在一起的臭名昭著的旧日期时间类
ZoneId zoneId = ZoneId.of( "America/Montreal" );
Locale locale = Locale.CANADA_FRENCH ;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MMM dd, yyyy h:mm:ss a" );
formatter = formatter.withLocale( locale );
formatter = formatter.withZone( zoneId );
ZonedDateTime zdt = ZonedDateTime.parse( input , formatter );
我们通常希望使用UTC中的值。为此,请使用UTC时间轴上的一个瞬间,分辨率为纳秒
Instant instant = zdt.toInstant();
转换
如果必须有一个旧类型,请使用添加到旧日期时间类的新方法来转换java.time
java.util.Date utilDate = java.util.Date.from( instant );
java.util.Calendar utilCal = java.util.GregorianCalendar.from( zdt );
2016年6月2日星期四17:10:30 EDT
vsGMT
@恐怖袋熊这是8小时您正在比较EDT与GMT。而且,当您更改时区时,您还将更加抵消te值。gettime的值是一个固定的时间点,与时区无关。它既是“2016年6月2日星期四,17:10:30(格林尼治标准时间-4)”(或美国东部时间)又是“2016年6月3日星期五,05:10:30(格林尼治标准时间+8)”,因为这是同一时间。这是因为您的解析方法使用系统的时区(EDT)进行翻译。如果要在不同的位置解析同一字符串,则getTime()的值会不同,因为“05:10:30 pm”是地球上不同的瞬间。@DaleJulian不在日历上,也不在解析器上(SimpleDataFormat
)。