我正在使用Parse作为我构建的应用程序的数据存储。我在类中有一个Date
参数,用于存储保存到Parse的食物的有效期。使用日期选择器(下面的代码)输入日期
日期选择器是这样创建的:
final DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateLabel();
}
};
expiry_date.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new DatePickerDialog(AddItem.this, date, myCalendar
.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH)).show();
}
});
更新标签方法将其转换为可读日期并显示在EditText
中 private void updateLabel() {
String myFormat = "dd/MM/yyyy"; //In which you need put here
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.UK);
EditText update = (EditText) findViewById(R.id.expiry_date);
update.setText(sdf.format(myCalendar.getTime()));
}
然后,当保存日期时,它会从字符串转换为日期
String dateString = expiry_date.getText().toString();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date convertedDate = new Date();
try {
convertedDate = dateFormat.parse(dateString);
} catch (java.text.ParseException e) {
e.printStackTrace();
}
这会显示正确的日期,正如我所期望的那样。但是,保存时,日期不正确。例如,如果我选择28/08/2015
,它将作为27/08/2015:2300
保存在Parse核心中。它总是在前一天晚上11点保存。
我不介意将时间添加到日期中,但我更喜欢在我选择的那天晚上11:59,所以我可以稍后比较日期。
显示日期时,它们实际显示正确的日期(例如,从日期选择器中选取的日期),而不是Parse中保存的日期。
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
String date = sdf.format(Calendar.getInstance().getTime());
Date datecomp = new Date();
datecomp.getDate();
int check = object.getDate("expiry").compareTo(datecomp);
Format formatter = new SimpleDateFormat("dd/MM/yyyy");
我认为这与日期转换有关,但我无法弄清楚为什么会这样做,而且我看过很多不同来源,似乎没有人描述我的问题。任何帮助将不胜感激
答案 0 :(得分:1)
Parse存储日期作为GMT参考(不是+ 3h或-2h GMT ei来自土耳其的人和来自美国的人在同一时刻有不同的时间。)因此,您应该通过将客户端时区保存在解析数据库中来进行本地化。
int offsetInMs = 3600000;
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
TimeZone timeZone = calendar.getTimeZone();
TimeZone gmt0 = timeZone.getTimeZone("GMT0");
TimeZone gmtNewYork = timeZone.getTimeZone("America/New_York");
TimeZone gmtLondon = timeZone.getTimeZone("Europe/London");
TimeZone gmtIstanbul = timeZone.getTimeZone("Asia/Istanbul");
TimeZone local = timeZone.getDefault();
System.out.println(gmt0.getID()+" -> "+gmt0.getOffset(date.getTime())/offsetInMs);
System.out.println(gmtNewYork.getID() + " -> " + gmtNewYork.getOffset(date.getTime())/offsetInMs);
System.out.println(gmtLondon.getID() + " -> " + gmtLondon.getOffset(date.getTime())/offsetInMs);
System.out.println(gmtIstanbul.getID() + " -> " + gmtIstanbul.getOffset(date.getTime())/offsetInMs);
System.out.println(local.getID()+ " -> " + local.getOffset(date.getTime())/offsetInMs);
即。您当地的时区为GMT + 2,当地时间为15:00 Parse保存为13:00(GMT)。你应该创建一个名为GMTOffset的列,它保持GMT + 2。
结果: GMT0 - > 0,America / New_York - > -4,欧洲/伦敦 - > 1,亚洲/伊斯坦布尔 - > 3,亚洲/伊斯坦布尔 - > 3
我认为Parse基准时间是GMT0。创建一个名为GMTOffset的列,它保留-4,1,3,3(用户本地偏移量)。
此外,如果您将在应用程序中使用解析时间,Parse可能会在客户端本地化时间。请检查一下。 附:根据我的经验,客户端时间不可靠,您应该使用您的服务器(如果存在)时间。