【问题标题】:How to convert a String to a Calendar object?如何将字符串转换为日历对象?
【发布时间】:2013-07-17 11:03:00
【问题描述】:

要在 SQLite 数据库中存储日历对象,我发现最简单的方法是将日历对象转换为字符串并将其作为文本存储在数据库中。

现在,问题在于从字符串中提取存储的日期。

如何解析包含 Calendar 对象的字符串并将其设置为 Calendar 值?

我的代码是:

    String CREATE_DOCTORS_TABLE = "CREATE TABLE " + TABLE_DOCTORS + "("
            + KEY_ID_DOC + " INTEGER PRIMARY KEY," + KEY_DOCTOR_NAME + " TEXT,"             
            + KEY_CLINIC_ADDRESS + " TEXT," + KEY_LAST_CHECKUP + " TEXT" + ");";
    db.execSQL(CREATE_DOCTORS_TABLE);       

其中 KEY_LAST_CHECKUP 包含如下值:

java.util.GregorianCalendar[time=?,areFieldsSet=false,lenient=true,zone=Asia/Calcutta,firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2013,MONTH=4,WEEK_OF_YEAR=29,WEEK_OF_MONTH=3,DAY_OF_MONTH=16,DAY_OF_YEAR=198,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=19,SECOND=47,MILLISECOND=823,ZONE_OFFSET=19800000,DST_OFFSET=0]

我以这种方式将其存储在数据库中:

values.put(KEY_LAST_CHECKUP, (doctor.getLastCheckUpDate().toString())); // last check up date

现在,我如何从存储的字符串中检索 DAY、MONTH 和 YEAR?

我在这里了解了如何将日期字符串转换为日历对象: How to convert a date String to a Date or Calendar object?

但我的字符串不仅仅是日期字符串。它还包含许多其他细节。

什么是最好的前进方式?

【问题讨论】:

标签: java android calendar android-calendar android-date


【解决方案1】:

更改您的数据模型以使用Date。这是存储在数据库中的常用类型。

您可以使用将Date 设置为Calendar

Calendar c = Calendar.getInstance();
c.setTime(date);

要从Calendar 中检索Date,您可以使用

date = c.getTime();

使用StringDate 存储在数据库中需要对Strings 进行格式化和解析,并且无法在数据库之外进行比较。

【讨论】:

  • 我尝试使用 Date 而不是 String 创建我的数据模型。但是,我不能在那种情况下使用 put 方法。也就是说, values.put(KEY_LAST_CHECKUP, doctor.getLastCheckUpDate(); 给我一个错误,说 ContentValues 类型中的方法 put(String, String) 不适用于参数 (String, Calendar)
  • @Kaushal 变量values是什么类型的?此外,您必须使用 values.put(KEY_LAST_CHECKUP, doctor.getLastCheckUpDate().getTime()); 然后才能获得 Date 而不是 Calendar
  • values 是一个 ContentValues 对象。另外,doctor.getLastCheckUpDate() 是一个返回日历对象本身的方法。
  • 对于ContentValues,您可以使用values.put(KEY_LAST_CHECKUP, doctor.getLastCheckUpDate().getTimeInMillis()); 将其存储为long。要再次设置Calendar,请使用cal.setTimeInMillis()
  • 是的,这听起来很可行。现在如果我使用values.put 输入long 值,那么我可以在sqlite 中创建表时使用integer 数据类型,对吧?
【解决方案2】:

如果您想在KEY_LAST_CHECKUP 列中保留字符串值。尝试使用SimpleDateFormat

如果你保持长值,你不需要使用SimpleDateFormat

插入:

SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String strDate = simpleFormat.format(doctor.getLastCheckUpDate());
values.put(KEY_LAST_CHECKUP, strDate);

检索:

try {
    String strDate = --> from DB
    Date parsedDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(strDate);
    Calendar c = Calendar.getInstance();
    c.setTime(parsedDate);
} catch (ParseException e) {
    return "Unknown";
}

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多