我尝试在android应用程序中访问当前日期时间,如下所示:
Calendar c = Calendar.getInstance();
int seconds = c.get(Calendar.SECOND);
//long time = System.currentTimeMillis();
Date date2 = new Date(seconds);
Log.d(">>>>>>>Current Date : ",""+date2);
它给出了1970年的日期和时间如下:
>>>>>>>Current Date :﹕ Thu Jan 01 05:30:00 GMT+05:30 1970
但是,它应该是2015年而不是1970年。 问题是什么?
我已从解决方案中解决了上述问题。实际上,我正在生成通知,因为数据库中的日期时间值与当前日期时间值匹配。但是,它不会产生通知。
我的代码如下:
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
doAsynchTask = new TimerTask() {
@Override
public void run() {
Log.d("Timer Task Background", "Timer task background");
Calendar c = Calendar.getInstance();
c.setTime(new Date());
long time = System.currentTimeMillis();
Date dateCurrent = new Date(time);
Log.d(">>>>>>>Current Date : ", "" + dateCurrent);
getListData();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm a");
Date dateFromDatabase;
for (int i = 0; i < remiderList.size(); i++) {
try {
System.out.print("+++" + remiderList.get(i).toString());
dateFromDatabase = formatter.parse(remiderList.get(i).toString());
Log.d(">>>>>Database date : ", "" + dateFromDatabase);
if (dateCurrent.equals(dateFromDatabase)) {
Toast.makeText(getApplicationContext(), "Date matched", Toast.LENGTH_LONG).show();
displayNotification();
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
};
timer.schedule(doAsynchTask, 0, 1000);
}
public void displayNotification() {
Notification.Builder builder = new Notification.Builder(MyRemiderService.this);
Intent intent1 = new Intent(this.getApplicationContext(),
HomeActivity.class);
Notification notification = new Notification(R.drawable.notification_template_icon_bg,
"This is a test message!", System.currentTimeMillis());
intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingNotificationIntent = PendingIntent.getActivity(
this.getApplicationContext(), 0, intent1,
PendingIntent.FLAG_UPDATE_CURRENT);
builder.setSmallIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha)
.setContentTitle("ContentTitle").setContentText("this for test massage")
.setContentIntent(pendingNotificationIntent);
notification = builder.getNotification();
notification.flags |= Notification.FLAG_AUTO_CANCEL;
/* notification.setLatestEventInfo(this.getApplicationContext(),
"AlarmManagerDemo", "This is a test message!",
pendingNotificationIntent);*/
mManager.notify(0, notification);
}
@Override
public void onDestroy() {
super.onDestroy();
}
public void getListData() {
remiderList = dbHelper.getAllRemiders();
}
我已经检查了Logcat中的两个值,如下所示:
09-15 17:50:00.629 17915-17927/? D/>>>>>>>Current Date :﹕ Tue Sep 15 17:50:00 GMT+05:30 2015
09-15 17:50:00.637 17915-17927/? D/>>>>>Database date :﹕ Tue Sep 15 17:50:00 GMT+05:30 2015
答案 0 :(得分:2)
您尚未在日历对象中设置当前日期。
Calendar c = Calendar.getInstance();
c.setTime(new Date());
//Calendar.SECOND will return only seconds from the date
//int seconds = c.get(Calendar.SECOND);
long time = c.getTime();
Date date2 = new Date(time);
Log.d(">>>>>>>Current Date : ",""+date2);
您可以使用SimpleDateFormat类格式化日期,如下所示
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
System.out.println(format.format(new Date()));
答案 1 :(得分:1)
试试这个
private String getCurrentDateAndTime() {
SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
return simple.format(new Date());
}
答案 2 :(得分:1)
您正在使用与最早版本的Java捆绑在一起的旧日期时间类,例如java.util.Date/.Calendar。事实证明,它们设计糟糕,令人困惑且麻烦。避免它们。
在许多混淆点中,java.util.Date表示日历日期和是一个时间,而java.sql.Date假装只代表一个没有任何日期的日期时间虽然它实际上只有一个时间设置为零(00:00:00.0
)。
旧的日期时间类已被java.time框架取代。请参阅Tutorial。
最终我们应该看到更新的JDBC驱动程序直接处理java.time类型。在此之前,我们仍然需要java.sql类型来获取数据进出数据库。但是立即调用添加到旧类的新转换方法以转换为java.time类型。
Instant
Instant
是UTC时间轴上的一个时刻,分辨率最高为nanoseconds。
java.sql.Timestamp ts = myResultSet.getTimestamp( x );
Instant instant = ts.toInstant();
LocalDate
如果您要将该日期时间的日期部分与今天的日期进行比较,请使用LocalDate
课程。此类真正表示没有时间且没有时区的仅日期值。
请注意,确定日期的时区至关重要,因为在任何给定时刻,日期可能因时区而异。因此,在提取LocalDate
之前,我们需要应用时区(ZoneId
)来获取ZonedDateTime
。如果省略时区,则会隐式应用JVM的当前默认时区。最好明确指定期望/预期的时区。
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Or "Asia/Kolkata", "Europe/Paris", and so on.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
LocalDate today = LocalDate.now( zoneId );
if( today.isEqual( zdt.toLocalDate() ) {
…
}
请注意,我们在该代码中没有使用字符串;而是所有日期时间对象。
要生成String
作为日期时间值的文本表示,您可以调用toString
方法以使用ISO 8601标准格式化文本。或者指定自己的格式模式。更好的是,让java.time自动完成本地化工作。为人类语言(英语,法语等)指定Locale
,用于翻译日/月等名称。
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM );
String output = zdt.format( formatter.withLocale( Locale.US ) ); // Or Locale.CANADA_FRENCH and so on.