gpt4 book ai didi

java - Android/Java - 计算日期差异显示不同的结果

转载 作者:行者123 更新时间:2023-12-02 11:45:22 26 4
gpt4 key购买 nike

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;
}

这是我用来计算今天与 2011 年 6 月 15 日之间天数差异的代码。

这在 Eclipse IDE 上总是有效,但是当我在 Android 上实现它时,它会随机显示 2 个不同的结果。

Screenshot

大多数时候显示2405,但有时显示2406(尽管日期应该没有改变,因为现在英国是凌晨 3 点。)

Console output

这是 System.out.println 上显示的内容。它具有相同的开始日期和结束日期,但出于随机原因,while 循环额外计数 1。怎么办?

这只发生在 Android 上。这是显示如何将 TextView 更新为小部件的代码(如果有帮助的话)。

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

final int count = appWidgetIds.length;
//Set Date Text
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.haruhi_widget);
long days=getDays();
remoteViews.setTextViewText(R.id.textView, days+context.getString(R.string.days));
//Set ImageView
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.haruhi1,options);
remoteViews.setImageViewBitmap(R.id.imageView,bitmap);

Intent intent = new Intent(context, HaruhiWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
remoteViews.setOnClickPendingIntent(R.id.imageView, getPendingSelfIntent(context, KYON_KUN_DENWA));

for (int i = 0; i < count; i++) {
// System.out.println(count+"appWidgetIds[i]");
int widgetId = appWidgetIds[i];
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
}

最佳答案

tl;博士

ChronoUnit.DAYS.between( 
LocalDate.of( 2011 , Month.JUNE , 15 ) ,
LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
)

问题

当然似乎是时区问题。我们无法确定,因为您没有向我们提供足够的信息,例如运行代码时使用的时区。

更重要的是,您正在使用麻烦的旧日期时间类,这些类在几年前就被 java.time 类过时了。

并且您正在尝试使用 date-with-time-of-day 类来处理仅日期值。

解决方案

calculate difference in Days between today and 2011 June 15th.

LocalDate类表示仅日期值,没有时间和时区。

时区对于确定日期至关重要。对于任何特定时刻,全局各地的日期都会因地区而异。例如,Paris France 午夜过后几分钟Montréal Québec 是新的一天,但仍然是“昨天” .

指定proper time zone name格式为大洲/地区,如America/Montreal , Africa/Casablanca ,或太平洋/奥克兰。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。

始终明确指定您想要/预期的时区。省略时区意味着隐式应用 JVM 当前的默认时区。该默认值可能因机器而异,甚至可能在运行时发生变化(!)。所以你的结果可能会有所不同。相反,请始终传递可选的 ZoneId 参数。这样做的好处是可以通过更多的自记录代码来明确您的 Intent 。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

获取 2011 年 6 月 15 日的日期。

LocalDate ld = LocalDate.of( 2011 , Month.JUNE , 15 ) ;

计算经过的天数。

long days = ChronoUnit.DAYS.between( ld , today ) ;
<小时/>

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在位于 maintenance mode ,建议迁移到java.time类。

要了解更多信息,请参阅 Oracle Tutorial 。并在 Stack Overflow 上搜索许多示例和解释。规范为JSR 310 .

从哪里获取java.time类?

关于java - Android/Java - 计算日期差异显示不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48246534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com