如何在 SQLite 中存储当前语言环境日期和时间

How to store current locale date and time in SQLite

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

我正在询问用户一些输入,我想存储提交此输入的日期(即日、月和年)和时间(即一天中的小时)。然后每次提交都保存在我的 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 读取数据库。因为我还需要根据日期过滤掉条目,即

Entries referring to last week // last month // All entries

所以我也想问:

我对这三个问题很困惑。


编辑: 终于想出了一开始想要的字符串怎么获取,简单到实例化一个新的Date对象:

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

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

如果您希望能够 运行 复杂的查询,例如查找上周的所有记录,我建议您改为将时间戳存储为整数。时间戳表示为自纪元(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();