Android SimpleDateFormat,如何使用它?

Mil*_*loš 42 java android

我试图SimpleDateFormat像这样使用Android :

String _Date = "2010-09-29 08:45:22"
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");

try {
    Date date = fmt.parse(_Date);
    return fmt.format(date);
}
catch(ParseException pe) {
    return "Date";    
}
Run Code Online (Sandbox Code Playgroud)

结果很好,我有:2010-09-29

但是,如果我改变SimpleDateFormat

SimpleDateFormat("dd-MM-yyyy");
Run Code Online (Sandbox Code Playgroud)

问题是我会得到03-03-0035 !!!!

为什么以及如何获得这样的格式dd-MM-yyyy

Dre*_*ejc 87

我假设您想要撤消日期格式?

SimpleDateFormat可用于解析和格式化.您只需要两种格式,一种解析字符串,另一种返回所需的打印输出:

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
Date date = fmt.parse(dateString);

SimpleDateFormat fmtOut = new SimpleDateFormat("dd-MM-yyyy");
return fmtOut.format(date);
Run Code Online (Sandbox Code Playgroud)

从Java 8开始:

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneOffset.UTC);
TemporalAccessor date = fmt.parse(dateString);
Instant time = Instant.from(date);

DateTimeFormatter fmtOut = DateTimeFormatter.ofPattern("dd-MM-yyyy").withZone(ZoneOffset.UTC);
return fmtOut.format(time);
Run Code Online (Sandbox Code Playgroud)

  • Android 的最低 API 级别为 26 (3认同)
  • 只需注意,普通的旧String.format()也可用于格式化日期输出.它不像SimpleStringFormat那样可读,但可能快一点,比如:String.format("%td-%tm-%tY",date). (2认同)

hel*_*sim 60

以下是所有可用的日期格式,请在此处阅读更多文档.

Symbol  Meaning                Kind         Example
D       day in year             Number        189
E       day of week             Text          E/EE/EEE:Tue, EEEE:Tuesday, EEEEE:T
F       day of week in month    Number        2 (2nd Wed in July)
G       era designator          Text          AD
H       hour in day (0-23)      Number        0
K       hour in am/pm (0-11)    Number        0
L       stand-alone month       Text          L:1 LL:01 LLL:Jan LLLL:January LLLLL:J
M       month in year           Text          M:1 MM:01 MMM:Jan MMMM:January MMMMM:J
S       fractional seconds      Number        978
W       week in month           Number        2
Z       time zone (RFC 822)     Time Zone     Z/ZZ/ZZZ:-0800 ZZZZ:GMT-08:00 ZZZZZ:-08:00
a       am/pm marker            Text          PM
c       stand-alone day of week Text          c/cc/ccc:Tue, cccc:Tuesday, ccccc:T
d       day in month            Number        10
h       hour in am/pm (1-12)    Number        12
k       hour in day (1-24)      Number        24
m       minute in hour          Number        30
s       second in minute        Number        55
w       week in year            Number        27
G       era designator          Text          AD
y       year                    Number        yy:10 y/yyy/yyyy:2010
z       time zone               Time Zone     z/zz/zzz:PST zzzz:Pacific Standard 
Run Code Online (Sandbox Code Playgroud)

  • 这是H,h,K和k之间的差异.kk = 1-24格式的小时数.hh = 1-12格式的小时.KK = 0-11格式的小时数.HH = 0-23格式的小时数. (2认同)

Aja*_*jay 11

我认为这个链接可能对你有帮助

要么

    Date date = Calendar.getInstance().getTime();
    //
    // Display a date in day, month, year format
    //
    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    String today = formatter.format(date);
    System.out.println("Today : " + today);
Run Code Online (Sandbox Code Playgroud)


Bla*_*elt 8

String _Date = "2010-09-29 08:45:22"
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat fmt2 = new SimpleDateFormat("dd-MM-yyyy");
    try {
        Date date = fmt.parse(_Date);
        return fmt2.format(date);
    }
    catch(ParseException pe) {

        return "Date";    
    }
Run Code Online (Sandbox Code Playgroud)

试试这个.


Arv*_*ash 6

使用 的日期时间 APIjava.util及其格式化 API,SimpleDateFormat我多次遇到惊喜,但这是最大的一次!

下面给出了您在问题中所描述的内容的说明:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

class Main {
    public static void main(String[] args) {
        System.out.println(formatDateWithPattern1("2010-09-29 08:45:22"));
        System.out.println(formatDateWithPattern2("2010-09-29 08:45:22"));
    }

    static String formatDateWithPattern1(String strDate) {
        SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = fmt.parse(strDate);
            return fmt.format(date);
        } catch (ParseException pe) {
            return "Date";
        }
    }

    static String formatDateWithPattern2(String strDate) {
        SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy");
        try {
            Date date = fmt.parse(strDate);
            return fmt.format(date);
        } catch (ParseException pe) {
            return "Date";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

2010-09-29
03-03-0035
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,SimpleDateFormat默默地进行了解析和格式化,没有发出警报。任何阅读本文的人都会毫不犹豫地完全停止使用它们并切换到现代日期时间 API

无论出于何种原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用ThreeTen-Backport,它向后移植了大部分java.time功能向后移植到 Java 6 和 7。

如果您正在处理 Android 项目,并且您的 Android API 级别仍然不符合 Java-8,请通过脱糖检查可用的 Java 8+ API以及如何在 Android 项目中使用 ThreeTenABP

使用现代日期时间 API:

由于根据输入字符串,这两个函数中使用的模式都是错误的,因此解析器应该发出警报,并且现代日期时间 API 的解析/格式化类型会负责任地执行此操作。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

class Main {
    public static void main(String[] args) {
        System.out.println(formatDateWithPattern1("2010-09-29 08:45:22"));
        System.out.println(formatDateWithPattern2("2010-09-29 08:45:22"));
    }

    static String formatDateWithPattern1(String strDate) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd");
        try {
            LocalDateTime date = LocalDateTime.parse(strDate, dtf);
            return dtf.format(date);
        } catch (DateTimeParseException dtpe) {
            return "Date";
        }
    }

    static String formatDateWithPattern2(String strDate) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-uuuu");
        try {
            LocalDateTime date = LocalDateTime.parse(strDate, dtf);
            return dtf.format(date);
        } catch (DateTimeParseException dtpe) {
            return "Date";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Date
Date
Run Code Online (Sandbox Code Playgroud)

故事的道德启示

  1. 日期时间 APIjava.util及其格式化 APISimpleDateFormat已过时且容易出错。完全停止使用它们并切换到现代日期时间 API。在Trail: Date Time中了解现代日期时间 API
  2. 解析时请遵循输入日期时间字符串中的格式。如果您希望以不同的格式输出,请使用解析器/格式化程序类的不同实例。

演示:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class Main {
    public static void main(String[] args) {
        String strDateTime = "2010-09-29 08:45:22";
        DateTimeFormatter dtfForParsing = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
        LocalDateTime ldt = LocalDateTime.parse(strDateTime, dtfForParsing);
        System.out.println(ldt);// The default format as returned by LocalDateTime#toString

        // Some custom formats for output
        System.out.println("########In custom formats########");
        DateTimeFormatter dtfForFormatting1 = DateTimeFormatter.ofPattern("dd-MM-uuuu HH:mm:ss");
        DateTimeFormatter dtfForFormatting2 = DateTimeFormatter.ofPattern("dd-MM-uuuu");
        DateTimeFormatter dtfForFormatting3 = DateTimeFormatter.ofPattern("'Day: 'EEEE, 'Date: 'MMMM dd uuuu");
        System.out.println(dtfForFormatting1.format(ldt));
        System.out.println(dtfForFormatting2.format(ldt));
        System.out.println(dtfForFormatting3.format(ldt));
        System.out.println("################################");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

2010-09-29T08:45:22
########In custom formats########
29-09-2010 08:45:22
29-09-2010
Day: Wednesday, Date: September 29 2010
################################
Run Code Online (Sandbox Code Playgroud)