如何在 SQLite 中存储当前语言环境日期和时间
How to store current locale date and time in SQLite
..然后检索并将它们显示为字符串?
我正在询问用户一些输入,我想存储提交此输入的日期(即日、月和年)和时间(即一天中的小时)。然后每次提交都保存在我的 SQlite 数据库中,然后从 RecyclerView
.
中检索
我至少面临两个问题。现在我在数据库中设置了两个 TEXT
字段,FIELD_DATE
和 FIELD_TIME
,我想在其中存储日期和时间的字符串表示形式,其格式取决于 Android 用户语言环境。
据我所读,android.text.format.DateFormat
应该对我有帮助。所以我设置:
java.text.DateFormat dateFormat = DateFormat.getMediumDateFormat(getActivity());
java.text.DateFormat timeFormat = DateFormat.getTimeFormat(getActivity());
现在我想我应该在两个对象上调用 format(Date d)
来获取我的字符串,但我不知道我从哪里得到这个 Date
对象 - 甚至不知道我的两个线是正确的。所以:
- 如何根据用户定义的(OS 级别)语言环境获取当前日期和时间的字符串表示形式?
也就是说(询问),我想知道日期和时间的两个字段是否真的是我要找的。如前所述,最后我想展示一个 RecyclerView
读取数据库。因为我还需要根据日期过滤掉条目,即
Entries referring to last week // last month // All
entries
所以我也想问:
考虑到需要轻松过滤掉属于上周的条目,双文本字段模式是否是存储日期和时间的正确选择?我应该更好地为日、月和年设置单独的列吗?
在给定 FIELD_DATE
/ FIELD_TIME
结构(或您可以建议的任何其他更好的结构)的情况下,如何查询数据库以仅包含上周的行?
我对这三个问题很困惑。
编辑: 终于想出了一开始想要的字符串怎么获取,简单到实例化一个新的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();
..然后检索并将它们显示为字符串?
我正在询问用户一些输入,我想存储提交此输入的日期(即日、月和年)和时间(即一天中的小时)。然后每次提交都保存在我的 SQlite 数据库中,然后从 RecyclerView
.
我至少面临两个问题。现在我在数据库中设置了两个 TEXT
字段,FIELD_DATE
和 FIELD_TIME
,我想在其中存储日期和时间的字符串表示形式,其格式取决于 Android 用户语言环境。
据我所读,android.text.format.DateFormat
应该对我有帮助。所以我设置:
java.text.DateFormat dateFormat = DateFormat.getMediumDateFormat(getActivity());
java.text.DateFormat timeFormat = DateFormat.getTimeFormat(getActivity());
现在我想我应该在两个对象上调用 format(Date d)
来获取我的字符串,但我不知道我从哪里得到这个 Date
对象 - 甚至不知道我的两个线是正确的。所以:
- 如何根据用户定义的(OS 级别)语言环境获取当前日期和时间的字符串表示形式?
也就是说(询问),我想知道日期和时间的两个字段是否真的是我要找的。如前所述,最后我想展示一个 RecyclerView
读取数据库。因为我还需要根据日期过滤掉条目,即
Entries referring to last week // last month // All entries
所以我也想问:
考虑到需要轻松过滤掉属于上周的条目,双文本字段模式是否是存储日期和时间的正确选择?我应该更好地为日、月和年设置单独的列吗?
在给定
FIELD_DATE
/FIELD_TIME
结构(或您可以建议的任何其他更好的结构)的情况下,如何查询数据库以仅包含上周的行?
我对这三个问题很困惑。
编辑: 终于想出了一开始想要的字符串怎么获取,简单到实例化一个新的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();