Android/Java-计算日期差异显示不同结果
这是我用来计算今天和2011年6月15日之间天数差的代码Android/Java-计算日期差异显示不同结果,java,android,date,calendar,Java,Android,Date,Calendar,这是我用来计算今天和2011年6月15日之间天数差的代码 ZoneId z = ZoneId.of( "America/Montreal" ); LocalDate today = LocalDate.now( z ); 这在EclipseIDE上总是有效的,但当我在Android上实现它时,它随机显示了两个不同的结果 大多数时候显示2405,但有时显示2406 (虽然日期本不应该改变,因为现在英国是凌晨3点。) 这是System.out.println上显示的内容。 它有相同的开始日期和
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
这在EclipseIDE上总是有效的,但当我在Android上实现它时,它随机显示了两个不同的结果
大多数时候显示2405,但有时显示2406
(虽然日期本不应该改变,因为现在英国是凌晨3点。)
这是System.out.println上显示的内容。
它有相同的开始日期和结束日期,但这是一个随机的机会,而循环计数1额外。怎么做
这只发生在Android上。
这是显示textview如何作为小部件进行更新(如果有帮助)的代码
public long getDays(){
Date today = new Date ( );
Calendar cal = Calendar.getInstance (TimeZone.getTimeZone("GMT"));
// Set as today
cal.setTime ( today );
System.out.println ( "Today Cal: "+cal.get ( Calendar.YEAR ) + "Y / " + ( cal.get ( Calendar.MONTH ) + 1 ) + "M / " + cal.get ( Calendar.DATE ) + " D" );
Calendar cal2 = Calendar.getInstance (TimeZone.getTimeZone("GMT") );
//Month has offset -1. June = 5
cal2.set ( 2011, 5, 15 );//YY MM DD
System.out.println ( "Start Day Cal2: "+cal2.get ( Calendar.YEAR ) + "Y / " + ( cal2.get ( Calendar.MONTH ) + 1 ) + "M / " + cal2.get ( Calendar.DATE ) + " D" );
long count = 0;
while ( !cal2.after ( cal ) ) {
count++;
//increment date
cal2.add ( Calendar.DATE, 1 );
}
System.out.println ( "Ending Cal2: "+cal2.get ( Calendar.YEAR ) + "Y / " + ( cal2.get ( Calendar.MONTH ) + 1 ) + "M / " + cal2.get ( Calendar.DATE ) + " D" );
return count;
}
@覆盖
公共void onUpdate(上下文上下文,AppWidgetManager AppWidgetManager,int[]AppWidgetId){
最终整数计数=appWidgetIds.length;
//设置日期文本
RemoteViews RemoteView=新的RemoteView(context.getPackageName(),R.layout.haruhi_小部件);
长天数=getDays();
setTextViewText(R.id.textView,days+context.getString(R.string.days));
//设置图像视图
BitmapFactory.Options=new-BitmapFactory.Options();
options.inScaled=false;
位图Bitmap=BitmapFactory.decodeResource(context.getResources(),R.drawable.haruhi1,options);
setImageViewBitmap(R.id.imageView,位图);
意向意向=新意向(上下文,HaruhiWidgetProvider.class);
setAction(AppWidgetManager.ACTION\u APPWIDGET\u UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_id,appWidgetIds);
setonClickPendingContent(R.id.imageView,getPendingSelfIntent(context,KYON_KUN_DENWA));
for(int i=0;i
tl;博士
问题
当然,这似乎是一个时区问题。我们无法确定,因为您没有向我们提供足够的信息,例如运行代码时使用的时区
更重要的是,您使用的是多年前由java.time类过时的旧日期时间类
您正在尝试使用date with time of day类处理仅日期值
解决方案
计算今天与2011年6月15日之间的天数差
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
该类表示一个仅限日期的值,不包含一天中的时间和时区
时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
始终明确指定所需/预期时区。省略区域意味着隐式应用JVM的当前默认时区。默认值可能因计算机而异,甚至在运行时(!)也可能有所不同。因此,您的结果可能会有所不同。相反,始终传递可选的ZoneId
参数。这样做的另一个好处是使用更多的自文档化代码来明确您的意图
ChronoUnit.DAYS.between(
LocalDate.of( 2011 , Month.JUNE , 15 ) ,
LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
)
获取2011年6月15日的日期
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
计算经过的天数
LocalDate ld = LocalDate.of( 2011 , Month.JUNE , 15 ) ;
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 从哪里获得java.time类
- ,及以后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time(JSR310)类
- 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看