Android SimpleDateFormat问题

发布于 2024-12-04 10:19:46 字数 360 浏览 3 评论 0原文

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

问题是什么?

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));

Is out putting

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

What is the issue?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

为你鎻心 2024-12-11 10:19:46

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

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

您应该使用 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));

The methods you are using in the Date class are deprecated.

  • You get 111 for the year, because getYear() returns a value that is the result of subtracting 1900 from the year i.e. 2011 - 1900 = 111.
  • You get 3 for the day, because getDay() returns the day of the week and 3 = Wednesday. getDate() returns the day of the month, but this too is deprecated.

You should use the Calendar class instead.

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));
北凤男飞 2024-12-11 10:19:46

阅读javadoc of java.util.Date< /code>仔细。

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

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

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

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

Read the javadoc of java.util.Date carefully.

getYear returns the number of years since 1900.

getMonth returns the month, starting from 0 (0 = January, 1 = February, etc.).

getDay returns the day of week (0 = Sunday, 1 = Monday, etc.), not the day of month.

And all these methods are deprecated. You shouldn't use them anymore.

辞慾 2024-12-11 10:19:46

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

在线演示

注意:无论出于何种原因,如果您需要的实例从 LocalDate 的这个对象的 java.util.Date 中,您可以执行以下操作:

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

跟踪:日期时间


* 如果您收到 java.util.Date 对象,请使用 Date#toInstant,并派生其他来自其中的 java.time 日期时间对象。

java.time

In March 2014, Java 8 introduced the modern, java.time date-time API which supplanted the error-prone legacy java.util date-time API. Any new code should use the java.time API*.

Solution using modern date-time API

Since the default formats used in the modern date-time API are based on ISO 8601 standards, you are not required to use a DateTimeFormatter object explicitly to parse a date string conforming to the ISO 8601 standards. You can directly use LocalDate#parse to parse it.

Formatted string for your logging:

You do not need to get individual date elements and join them to obtain a formatted string for your logging. You can create another DateTimeFormatter object with the required format and format the LocalDate to get the required string as shown below:

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

Demo:

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)));
    }
}

Output:

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

Online Demo

Note: For whatever reason, if you need an instance of java.util.Date from this object of LocalDate, you can do so as follows:

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

Learn more about the modern date-time API from Trail: Date Time.


* If you receive a java.util.Date object, convert it to a java.time.Instant object using Date#toInstant, and derive other java.time date-time objects from it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文