我正在开发一个使用数据库的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()
转换为日期?
这是在真实设备中运行应用的结果:
答案 0 :(得分:1)
您需要修改Calendar
的存储方式,调用getTime()
并根据需要对其进行格式化。例如,
Calendar cal = Calendar.getInstance();
DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
System.out.println(sdf.format(cal.getTime()));
答案 1 :(得分:1)
( 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 类,该类取代了可怕的旧类Calendar
和GregorianCalendar
。
遇到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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅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类?