Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的SimpleDataFormat_Java_Android_Date_Simpledateformat - Fatal编程技术网

Java中的SimpleDataFormat

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

我有一组助手方法,目前正用于格式化从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 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 );
}