【问题标题】:How to store current locale date and time in SQLite如何在 SQLite 中存储当前语言环境的日期和时间
【发布时间】:2015-02-25 16:45:47
【问题描述】:

..然后将它们检索并显示为字符串?

我正在询问用户一些输入,我想存储提交该输入的日期(即日、月和年)和时间(即一天中的小时)。然后每个提交都保存在我的 SQlite 数据库中,然后从RecyclerView 中检索。

我至少面临两个问题。现在我在数据库中设置了两个TEXT 字段FIELD_DATEFIELD_TIME,我想在其中存储日期和时间的字符串表示形式,其格式取决于Android 用户区域设置。

根据我的阅读,android.text.format.DateFormat 应该对我有所帮助。所以我设置:

java.text.DateFormat dateFormat = DateFormat.getMediumDateFormat(getActivity());
java.text.DateFormat timeFormat = DateFormat.getTimeFormat(getActivity());

现在我想我应该在两个对象上调用 format(Date d) 来获取我的字符串,但我不知道我从哪里得到这个 Date 对象 - 甚至不知道我的两行是否正确。所以:

  • 如何根据用户定义的(在操作系统级别)区域设置获取当前日期和时间的字符串表示形式?

也就是说(被问到),我想知道日期和时间的两个字段是否真的是我想要的。如前所述,最后我想展示一个RecyclerView 读取数据库。因为我还需要根据日期过滤掉条目,即

涉及上周的条目 // 上个月 // 全部 条目

所以我也在问:

  • 考虑到需要轻松过滤掉属于上周的条目,双文本字段模式是否是存储日期和时间的正确选择?我应该更好地为日、月和年分别列吗?

  • 在给定 FIELD_DATE / FIELD_TIME 结构(或您可以建议的任何其他更好的结构)的情况下,如何查询数据库以仅包含上周的行?

我很纠结这三个问题。


编辑:终于想出了如何得到我最开始想要的字符串,就像实例化一个新的Date对象一样简单:

Date d = new Date();
String date = DateFormat.getMediumDateFormat(getActivity()).format(d);
String time = DateFormat.getTimeFormat(getActivity()).format(d);

现在我既需要显示这些字符串(这很简单,因为它们已经格式化了),也需要对数据库应用一些过滤器,比如属于上周的条目(这反过来会很简单自 1970 年以来以毫秒为单位的当前时间)。怎么办?

【问题讨论】:

  • 我将它以字符串格式存储在我当前的项目中

标签: android sqlite date android-cursor


【解决方案1】:

如果您希望能够运行复杂的查询,例如查找上周的所有记录,我建议您将时间戳存储在整数中。时间戳表示为自纪元(1970 年 1 月 1 日)以来的毫秒数。它使查询确切的日期和时间范围变得容易。 时间戳很容易从例如System.currentTimeMillis().

另一种方法是使用 sqlite 的内置日期类型,但我个人会选择时间戳方法。 首先,您是否有任何理由希望以当前语言环境的格式存储它?如果您向用户显示日期,则最好在显示时将时间戳格式化为日期,使用 Java 和 android 的众多日期功能之一,例如 java.util.Calendar、java.util.Date、android .text.SimpleDateFormat 等

例如,您可以运行以下代码来获取本月初的时间戳:

Calendar now = Calendar.getInstance();

now.set(Calendar.DAY_OF_MONTH, 1);
now.set(Calendar.HOUR_OF_DAY, 0);
now.set(Calendar.MINUTE, 0);
now.set(Calendar.SECOND,  0);

long startOfThisMonth = now.getTimeInMillis();    

【讨论】:

  • 刚刚编辑了我的问题。我对这些字符串很满意,因为我需要将它们展示给用户。我知道如何存储TimeInMillis 并查询数据库。但是鉴于此long,我以后如何将其格式化为字符串、基于语言环境的、人类可读的表示形式?我想念这个简单的步骤。
  • 最好将它们存储为时间戳并在显示时转换为人类可读的。有无数实用程序可以将millis 转换为特定于语言环境的字符串,例如developer.android.com/reference/java/text/SimpleDateFormat.html 有一个采用Date 的格式方法,而Date 有一个采用milis 的构造函数。如果您坚持在数据库中使用字符串,您会发现很难进行有意义的查询。
  • 我会尽快尝试的。同时,你认为存储字符串(显示)和毫秒时间(查询数据库)没有用吗?
  • 这似乎完全多余,因为在需要时将时间戳转换为字符串是微不足道的。存放物品时只会造成额外的努力。如果用户更改语言(后者是不在数据库中存储特定于区域设置的字符串的另一个原因),也会导致问题,因为数据库将包含存储项目时使用的语言的字符串。根本没有充分的理由将日期存储为字符串。
  • 现在我已经尝试过了,我可以说它真的微不足道。非常感谢,我一直在想字符串,我很困惑。
猜你喜欢
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
相关资源
最近更新 更多