Parse.com日期保存不正确

时间:2015-08-25 11:31:05

标签: android date parse-platform

我正在使用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");

我认为这与日期转换有关,但我无法弄清楚为什么会这样做,而且我看过很多不同来源,似乎没有人描述我的问题。任何帮助将不胜感激

1 个答案:

答案 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可能会在客户端本地化时间。请检查一下。 附:根据我的经验,客户端时间不可靠,您应该使用您的服务器(如果存在)时间。