Java中的SimpleDataFormat
我有一组助手方法,目前正用于格式化从API接收的日期Java中的SimpleDataFormat,java,android,date,simpledateformat,Java,Android,Date,Simpledateformat,我有一组助手方法,目前正用于格式化从API接收的日期 public static String ParseDate (String dateR) { SimpleDateFormat full_date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US); try { full_date.setTimeZone(TimeZone.getTimeZone("GMT")); Date
public static String ParseDate (String dateR) {
SimpleDateFormat full_date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
try {
full_date.setTimeZone(TimeZone.getTimeZone("GMT"));
Date date = full_date.parse(dateR);
Calendar c = Calendar.getInstance();
c.setTime(date);
String day = GetDay(c.get(Calendar.DAY_OF_WEEK));
int hr = c.get(Calendar.HOUR_OF_DAY);
int min = c.get(Calendar.MINUTE);
return day + ", " + hr+ ":" + min;
} catch (Exception e) {
System.err.println("Error" + e);
}
return dateR;
}
private static String GetDay(int d)
{
switch (d)
{
case 1:
return "Sunday";
case 2:
return "Monday";
case 3:
return "Tuesday";
case 4:
return "Wednesday";
case 5:
return "Thursday";
case 6:
return "Friday";
case 7:
return "Saturday";
default:
return "";
}
}
我这样称呼他们:
String str = "2013-09-11T12:50:00Z";
System.out.println(ParseDate(str));
它工作得很好。但是,我想改进它的功能。
如果一周中的某一天不是本周,我希望显示该日期,而不是显示一周中的某一天。如果一周中的某一天不是当前一周的某一天,则显示该天是错误的
任何帮助都将不胜感激。多谢各位
[更新]:
例如:
日期为:2013-09-11T12:50:00Z
我得到这个输出:星期三,18:20
这是错误的。在这种情况下,像2013年5月24日这样的简单日期会更好
这意味着我需要能够测试该日期是在本周内还是超过本周,如果格式基于该日期。我希望您能明白:您的代码有问题。我认为您只是从其他来源复制粘贴了这段代码,但不理解代码 根据你的代码,给你的输出是好的
String day = GetDay(c.get(Calendar.DAY_OF_WEEK)); // this will return Day (Wednesday).
int hr = c.get(Calendar.HOUR_OF_DAY); //return Hour of Date (18 in Your Case)
int min = c.get(Calendar.MINUTE);(Return Minutes ) (20 in Your Case)
return day + ", " + hr+ ":" + min; // return "Wednesday, 18:20"
所以,你从你的方法中得到的最终结果将是周三18:20
只需更改以上代码即可得到答案
int year = currentCalendar.get(Calendar.YEAR);
String month = currentCalendar.get(Calendar.MONTH);
int day = currentCalendar.get(Calendar.DAY_OF_MONTH);
return day + "th " + month + " " + year ; // return "24th February ,1991"
如果你要求每月的某一天,也许会有帮助
int day = c.get(Calendar.DAY_OF_MONTH);
然后可以将格式设置为字符串,如:
String currentDate = String.format("%d %s %d", day, monthName, year);
结果不是周三,而是24日
完整日期格式化程序可以是:
Calendar c = Calendar.getInstance();
int day = c.get(Calendar.DAY_OF_MONTH);
int month = c.get(Calendar.MONTH);
String monthName = null;
switch (month){
case 0: monthName = "January"; break;
case 1: monthName = "February"; break;
case 2: monthName = "March"; break;
case 3: monthName = "April"; break;
case 4: monthName = "May"; break;
case 5: monthName = "June"; break;
case 6: monthName = "July"; break;
case 7: monthName = "August"; break;
case 8: monthName = "September"; break;
case 9: monthName = "October"; break;
case 10: monthName = "November"; break;
case 11: monthName = "December"; break;
default: break;
}
int year = c.get(Calendar.YEAR);
String currentDate = String.format("%d %s %d", day, monthName, year);
使用
而不是
return day + ", " + hr+ ":" + min;
使用
java.time
您使用的是一些麻烦的旧日期时间类,这些类现在已经被java 8及更高版本中内置的java.time框架所淘汰。对于Java6和Java7,请使用该项目。对于Android,该项目的改编。避免使用旧类;他们真的那么糟糕
ISO 8601
您的输入字符串符合ISO 8601标准。在解析/生成日期时间值的文本表示时,java.time类默认使用格式。因此,无需指定格式化模式
瞬间
瞬间是UTC时间线上的一个瞬间
Instant instant = Instant.parse( "2013-09-11T12:50:00Z" );
周数
只有在时区的情况下,一周才有意义,因此我们应用时区来获得ZonedDateTime
使用星期1是日历年的第一个星期四,运行星期一和星期日来获取周数
int weekNumberThen = zdt.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
int weekNumberNow = ZonedDateTime.now( zoneId ).get( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
生成日期时间值的文本表示形式
通过测试两周数字是否相等来完成业务逻辑。请注意,我们如何使用方便的DayOfWeek枚举自动本地化为星期几的显示名称。请注意,我们如何切换到LocalDate以格式化仅日期值输出
Locale locale = Locale.CANADA_FRENCH; // Or Locale.US, and so on.
String output = null;
if( weekNumberThen == weekNumberNow ) {
DayOfWeek dayOfWeek = zdt.getDayOfWeek();
output = dayOfWeek.getDisplayName( TextStyle.FULL , locale );
} else {
LocalDate localDate = zdt.toLocalDate();
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( locale );
output = localDate.format( formatter );
}
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
该项目现已启动,建议迁移到类
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*类。Hibernate5和JPA2.2支持java.time
从哪里获得java.time类
、和更高版本-标准Java API的一部分,带有捆绑实现。
带来了一些小功能和修复。
和
大多数java.time功能都在中向后移植到Java6和Java7。
Android 26+的更高版本捆绑了java.time类的实现。
对于早期的Android,请用一个示例缩写。你的问题没有被澄清,实际上@ClintonI认为这是一个例子:String str=2013-09-11T12:50:00Z;System.out.printlnprassedatestr;我不确定我是否理解。但是,对代码的一个很好的改进是使用日历常量替换开关盒的编号,例如,将1替换为Calendar.SUNDAY,将2替换为Calendar.MONDAY,等等。好的,谢谢,我已经更新了一个示例:检查此链接。应该可以帮助您注意,Calendar.WEEK of the_YEAR因地区而异。也就是说,该类课程对一周的定义各不相同,包括开始日周日与周一等,以及第1周的标志。这因地区而异,根据您的需要,可能是好的,也可能是坏的。最好始终指定所需/预期的区域设置,而不是隐式地依赖JVM的当前默认区域设置。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
int weekNumberThen = zdt.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
int weekNumberNow = ZonedDateTime.now( zoneId ).get( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
Locale locale = Locale.CANADA_FRENCH; // Or Locale.US, and so on.
String output = null;
if( weekNumberThen == weekNumberNow ) {
DayOfWeek dayOfWeek = zdt.getDayOfWeek();
output = dayOfWeek.getDisplayName( TextStyle.FULL , locale );
} else {
LocalDate localDate = zdt.toLocalDate();
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( locale );
output = localDate.format( formatter );
}