【问题标题】:Format a datetime string to time only仅将日期时间字符串格式化为时间
【发布时间】:2011-01-24 03:02:33
【问题描述】:

我正在从 SQLite DB 中检索日期时间,该日期时间格式为...

2011-01-24 02:45:00

在 C# 中,我可以简单地使用 DateTime.Parse("2011-01-24 02:45:00").ToString("HH:mm") 来获取字符串 02:45

我可以在 Android/Java 中执行此操作吗?我的 Android 应用中的代码如下所示...

// dateStr below is logging as correctly being yyyy-MM-dd HH:mm:ss format
String dateStr = cursor.getString(cursor.getColumnIndex("start_time"));
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
String shortTimeStr = sdf.format(dateStr); // <-- throws IllegalArgumentException

编辑:感谢 doc_180 和 Konstantin Burov - 给出的示例帮助我解决了问题。部分问题是我导入的是 java.sql.Date 而不是 java.util.Date。我已经改变了一些东西,现在它对我来说非常有效。

【问题讨论】:

  • SimpleDateFormat 需要日期参数,而不是字符串。您应该将日期存储为毫秒并从中创建一个日期对象。 Date d = new Date(dateAsMillisec) 然后将其传递给 simpledateformat。
  • @doc_180:好的,抱歉,你说的很对——可能需要重新考虑我的问题。我的问题是我在 Android 端的数据库是基于 PC 的应用程序的 SQLite 数据库的“镜像”,它使用长/反向日期时间格式,我想保持格式相同。我尝试使用 Date.parse(String) 然后 sdf.format(...) 但这也引发了异常。
  • 你试过我的代码了吗?它有效,我已经检查过了。

标签: java android date-format simpledateformat


【解决方案1】:

您需要执行以下操作。

try {
   Date date = null;
   date = df.parse("2011-01-24 02:45:00");
   SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
   String shortTimeStr = sdf.format(date);
   System.out.println(shortTimeStr);
} catch (ParseException e) {
   // To change body of catch statement use File | Settings | File Templates.
   e.printStackTrace(); 
}

正如我在评论中提到的,您应该将时间存储为毫秒而不是字符串。否则,除了创建中间人对象 Date 之外,我看不到任何其他方法。

【讨论】:

  • 谢谢,请参阅我的问题末尾的编辑。我认为存储日期尽可能长(毫秒)可能是未来的一种方式,但目前,我正在镜像由其他人创建的 PC SQLite DB,所以我坚持在 PC/Android 之间使用相同的格式。
  • df 代表什么?
  • df 代表日期格式。似乎 df 引用了 SimpleDateFormat 来解析日期。
【解决方案2】:

SimpleDateFormat.format 在您传递字符串时需要日期或日历作为参数。首先将字符串转换为日期。

String dateStr = cursor.getString(cursor.getColumnIndex("start_time"));
SimpleDateFormat toFullDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date fullDate = toFullDate.parse(dateStr);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
String shortTimeStr = sdf.format(fullDate); 

是的,我宁愿将日期存储在数据库中,因此获取一个 Date 对象会更简单:

Long dateMilliseconds = cursor.getLong(cursor.getColumnIndex("start_time"));
Date fullDate = new Date(dateMilliseconds);

【讨论】:

  • 谢谢,请在我的问题末尾查看我的编辑。我认为存储日期尽可能长(毫秒)可能是未来的一种方式,但目前,我正在镜像由其他人创建的 PC SQLite DB,所以我坚持在 PC/Android 之间使用相同的格式。
猜你喜欢
  • 2012-09-07
  • 1970-01-01
  • 2020-08-07
  • 2014-10-29
  • 1970-01-01
  • 2023-03-14
  • 2014-08-10
  • 2018-05-17
相关资源
最近更新 更多