Android SimpleDateFormat问题

问题描述 投票:0回答:3
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date date = (Date)formatter.parse("2011-09-13");
Log.e(MY_DEBUG_TAG, "Output is "+ date.getYear() + " /" + date.getMonth() + " / "+ (date.getDay()+1));

已推出

09-13 14:20:18.740: ERROR/GoldFishActivity(357): Output is 111 /8 / 3

问题是什么?

java android date simpledateformat date-format
3个回答
6
投票

您在

Date
类中使用的方法已被弃用。

  • 您得到的年份为 111,因为
    getYear()
    返回的值是年份减去 1900 的结果,即
    2011 - 1900 = 111
  • 当天的值是 3,因为
    getDay()
    返回星期几,而
    3 = Wednesday
    getDate()
    返回月份中的第几天,但这也已被弃用。

您应该使用

Calendar
类。

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date date = (Date)formatter.parse("2011-09-13");        
Calendar cal = Calendar.getInstance();  
cal.setTime(date);
Log.e(MY_DEBUG_TAG, "Output is "+ cal.get(Calendar.YEAR)+ " /" + (cal.get(Calendar.MONTH)+1) + " / "+ cal.get(Calendar.DAY_OF_MONTH));

4
投票

仔细阅读java.util.Date

javadoc。

getYear
返回自 1900 年以来的年数。

getMonth
返回月份,从 0 开始(0 = 一月,1 = 二月等)。

getDay
返回星期几(0 = 星期日,1 = 星期一等),而不是月份中的哪一天。

所有这些方法都已被弃用。你不应该再使用它们了。


0
投票

java.time

2014 年 3 月,Java 8 引入了现代的

java.time
日期时间 API,取代了容易出错的旧版
java.util
日期时间 API
。任何新代码都应使用
java.time
API*

使用现代日期时间 API 的解决方案

由于现代日期时间 API 中使用的默认格式基于 ISO 8601 标准,因此您不需要显式使用

DateTimeFormatter
对象来解析符合 ISO 8601 标准的日期字符串。可以直接使用
LocalDate#parse
来解析。

用于记录的格式化字符串:

您不需要获取单独的日期元素并将它们连接起来以获得用于记录的格式化字符串。您可以创建另一个具有所需格式的

DateTimeFormatter
对象,并格式化
LocalDate
以获得所需的字符串,如下所示:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
Log.e(MY_DEBUG_TAG, String.format("Output is %s", date.format(formatter)));

演示:

public class Main {
    public static void main(String args[]) {
        LocalDate date = LocalDate.parse("2011-09-13");
        System.out.println(date);

        // Formatted string for logging
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        System.out.println(String.format("Output is %s", date.format(formatter)));
    }
}

输出:

2011-09-13
Output is 2011/09/13

在线演示

注意:无论出于何种原因,如果您需要

java.util.Date
对象的
LocalDate
实例,您可以按如下方式操作:

Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant());

Trail:日期时间了解有关现代日期时间 API 的更多信息。


* 如果您收到

java.util.Date
对象,请使用
java.time.Instant
 将其转换为 
Date#toInstant
对象,并从中派生其他
java.time
日期时间对象。

© www.soinside.com 2019 - 2024. All rights reserved.