好吧,我要疯了。我测试了许多解决方案,但没有得到正确的结果!
让我解释一下:我已经用SQLite数据库创建了一个应用程序。在一张表上,我记录了一些关于用户当前位置的信息,比如纬度、经度和时间戳!
我选择时间戳是因为它"与格式无关"。我稍后在显示器上格式化这个。
这是问题的开始。
我创建了一个函数,将时间戳转换为日期和时间的字符串表示。容易的是的,这是我以前想的。
这是函数(带有一些垃圾测试):
private String getDate(Timestamp timestamp) {
/*Calendar cal = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
cal.setTimeInMillis(timestamp.getTime());
String date = DateFormat.format("dd/MM/yyyy HH:mm", cal).toString();*/
//Time time = new Time(Time.getCurrentTimezone());
/*Time time = new Time();
time.set(timestamp.getTime());
time.switchTimezone(Time.getCurrentTimezone());
//String date = time.format3339(false);
String date = time.format2445();*/
//String date = DateFormat.getDateFormat(this).format(new Date(timestamp.getTime()));
//String date = DateUtils.formatDateTime(this, timestamp.getTime(), DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME);
String date = DateFormat.getDateFormat(this).format(new Date(timestamp.getTime())) + " " + DateFormat.getTimeFormat(this).format(new Date(timestamp.getTime()));
return date;
}
问题是显示的时间不正确!例如,时间戳是今天21:01,但它显示的内容类似于"09/04/2014 19:01"。差两个小时!
在我测试的每一个解决方案中,差异都是相同的。为什么两个小时?我想现在是UTC时间。但我注意时区。
需要注意的是,我有生成时间戳的位置。也许他可以用来确定正确的时区?
有什么建议或解决方案(即使不太容易)?
附言:我住在瑞士。
编辑:
创建条目时会自动创建时间戳('CREATION_TIMESTAMP' TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
)。
这里是我用来读取数据库上位置的两个函数:
public Location getLocation(long id) {
Cursor cursor = db.query(LocationSQLiteHelper.TABLE_NAME, allColumns, LocationSQLiteHelper.COLUMN_ID + " = " + id, null, null, null, null);
cursor.moveToFirst();
return cursorToLocation(cursor);
}
private Location cursorToLocation(Cursor cursor) {
Location location = new Location();
location.setId(cursor.getLong(0));
location.setLatitude(cursor.getDouble(1));
location.setLongitude(cursor.getDouble(2));
location.setAccuracy(cursor.getFloat(3));
location.setCreationTimestamp(Timestamp.valueOf(cursor.getString(4)));
return location;
}
也许我应该用约会代替?但这可能是格式的问题,不是吗?
我找到了一个解决方案!事实上,时间戳是UTC,并且没有存储关于时区的信息。
我的函数getDate()
现在是这样的(由https://stackoverflow.com/a/18692993/2416369):
private String getDate(Timestamp timestamp) {
Calendar calendar = Calendar.getInstance();
TimeZone tz = TimeZone.getDefault();
calendar.setTimeInMillis(timestamp.getTime());
calendar.add(Calendar.MILLISECOND, tz.getOffset(calendar.getTimeInMillis()));
SimpleDateFormat sdf = (SimpleDateFormat)SimpleDateFormat.getDateTimeInstance();
Date currenTimeZone = (Date)calendar.getTime();
String date = sdf.format(currenTimeZone);
return date;
}