如何使用SimpleDateFormat.parse()将Calendar.toString()转换为日期?

时间:2017-06-05 03:31:09

标签: java android calendar simpledateformat

我正在开发一个使用数据库的Android应用程序,每次用户插入新的寄存器时,当前数据和时间都将保存在数据库中

Calendar cal = Calendar.getInstance();

所以,当我从db中检索数据时,得到了一个像这样的字符串:

  

java.util.GregorianCalendar中[时间= 1496007575129,areFieldsSet =真,宽大=真,区=美洲/墨西哥城,Firstdayofweek可= 1,minimalDaysInFirstWeek = 1,ERA = 1,YEAR = 2017,MONTH = 4,WEEK_OF_YEAR = 22 ,WEEK_OF_MONTH = 5,DAY_OF_MONTH = 28,DAY_OF_YEAR = 148,DAY_OF_WEEK = 1,DAY_OF_WEEK_IN_MONTH = 4,AM_PM = 1,HOUR = 4,HOUR_OF_DAY = 16,MINUTE = 39,SECOND = 35,微差= 129,ZONE_OFFSET = -21600000, DST_OFFSET = 3600000]

当我尝试使用SimpleDateFormat.parse转换String以在RecyclerView中显示它时出现问题,我总是在同一个日期:09/04/2017。

这是我的RecViewAdapter.java中的代码:

@Override
public void onBindViewHolder(ViewHolder holder,int position){
    items.moveToPosition(position);

    String s,d,p,f;


    s = items.getString(ConsultaTomas.SISTOLICA);
    holder.systolica.setText(s);

    d = items.getString(ConsultaTomas.DIASTOLICA);
    holder.diastolica.setText(d);

    p = items.getString(ConsultaTomas.PULSO);
    holder.pulso.setText(p);

    f = items.getString(ConsultaTomas.FECHA);
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

    try {
        holder.fecha.setText(sdf.format(sdf.parse(f)));

    }catch (ParseException e){
        Log.d("PARSINGFECHA","Error al parcear fecha");
    }


}

其他数据在RecView中正确显示,并且日历字符串都不同,因此这些字符串中的日期/小时不同。所以,问题是:

如何使用Calendar.toString()SimpleDateFormat.parse()转换为日期?

这是在真实设备中运行应用的结果: two muppets

2 个答案:

答案 0 :(得分:1)

您需要修改Calendar的存储方式,调用getTime()并根据需要对其进行格式化。例如,

Calendar cal = Calendar.getInstance();
DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
System.out.println(sdf.format(cal.getTime()));

答案 1 :(得分:1)

tl; dr

( GregorianCalendar ) myCal                    // Cast the more general `Calendar` to subclass `GregorianCalendar`. 
.toZonedDateTime()                             // Convert from terrible legacy class `GregorianCalendar` to its modern replacement `ZonedDateTime`. 
.toLocalDate()                                 // Extract just the date, without the time-of-day and without the time zone. Returns a `LocalDate` object.
.format(                                       // Generate text representing the value of this `LocalDate` object.
    DateTimeFormatter
    .ofLocalizedDate( FormatStyle.SHORT )      // Automatically localize the text.
    .withLocale( new Locale( "es" , "ES" ) )   // Specify a `Locale` to determine the human language and cultural norms to use in localization.
)

java.time

现代方法使用了几年前的 java.time 类,该类取代了可怕的旧类CalendarGregorianCalendar

遇到Calendar对象时,请假设您的对象实际上是ZonedDateTime,请立即将其转换为GregorianCalendar

if( myCal instanceOf GregorianCalendar )
{
    GregorianCalendar gc = ( GregorianCalendar ) myCal ;  // Cast from more general class to the specific class.
    ZonedDateTime zdt = gc.toZonedDateTime() ;
}

您显然只对日期部分感兴趣,而没有时间和时区。因此,提取一个LocalDate

LocalDate ld = zdt.toLocalDate() ;  // Ignore time-of-day and time zone.

以您想要的格式生成文本。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
String output = ld.format( f ) ;

或更好:让 java.time 为您自动本地化。

Locale locale = new Locale( "es" , "ES" ) ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( locale ) ;

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规范为JSR 310

Joda-Time项目(现在位于maintenance mode中)建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。 Hibernate 5和JPA 2.2支持 java.time

在哪里获取java.time类?