所以我有一个日历,我需要设置一个特定的日期..
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
从millis转换为Date,这是输出:
因此Date
设置为June 2, 2016 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;
}
答案 0 :(得分:2)
问题始终存在于Genymotion's
TimeZone
上。它被设置为与我的位置不同的时区。
答案 1 :(得分:1)
两个不同的JVM,每个JVM都有自己的(不同的)当前默认时区。在解析字符串时,每个都使用自己当前的默认时区来解释输入数据的含义。
解决方案:始终指定所需/预期的时区。
JVM的当前默认时区可以通过各种方式初始化。并且当前默认时区可以在运行时中由JVM中任何应用程序的任何线程中的任何代码更改。所以永远不要依赖于这个时区的外部性。
以continent/region
的格式指定proper time zone name。切勿使用诸如EDT
,IST
,CST
等3-4个字母的缩写。这些不是真正的时区,不是标准化的,并且不是唯一的(!)。
同样适用于Locale
,用于解析日期和时间的名称。月,确定逗号与期间等。 JVM的当前默认值Locale
不受您的控制。因此,请始终指定适合输入数据上下文的所需/预期Locale
。
您正在使用旧的日期时间类,这些类已被证明设计糟糕,令人困惑且麻烦。避免它们。
{8}类内置于Java 8及更高版本中。他们的大部分功能已经被移植到Java 6& java.time项目中的7,并在ThreeTen-Backport项目中进一步适应Android。
java.time类是非常成功的Joda-Time库的继承者,这两个项目由同一个人ThreeTenABP领导。 java.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中的值。为此,请使用Stephen Colbourne,以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 );