Android 中的日期格式日历

date format Calendar in Android

是这样写的,我想改写。我希望它用土耳其语写成 Friday Mar 27。当我更改 SimpleDateFormat 中的拼写时 Returns null。我正在打印从数据库中提取的数据。

我想要的输出是: Cuma Mar 27(土耳其语)

数据库输出:

date ":" 2019-11-27 14: 42: 23.000000 "," timezone_type ": 3," timezone ":" UTC "

Android 输出:

Fri Mar 27 14:42:23 GMT+03:00 2020

代码:

JSONObject form_tarih2 = jObj.getJSONObject("form_tarih2");
String date = form_tarih2.getString("date");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", 
        java.util.Locale.getDefault());
Date calculateDate = sdf.parse(date);
tarihstring = calculateDate;

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
calendar.setTime(sdf.parse(String.valueOf(tarihstring)));

calendar.add(Calendar.MONTH,4);
Date future = calendar.getTime();

使用它来转换日期。使其静态化以在应用程序的任何地方使用

        String s=getFormatedTime("2019-11-27 14: 42: 23.000000","yyyy-MM-dd HH:mm:ss.SSSSSS","EEEE MMM dd");

你的函数:-

public static String getFormatedTime(String dateStr, String strReadFormat, String strWriteFormat) {
    if (dateStr == null) return "";
    String formattedDate = dateStr;

    DateFormat readFormat = new SimpleDateFormat(strReadFormat, Locale.getDefault());
    DateFormat writeFormat = new SimpleDateFormat(strWriteFormat, new Locale("tr"));

    Date date = null;

    try {
        date = readFormat.parse(dateStr);
    } catch (ParseException e) {
    }

    if (date != null) {
        formattedDate = writeFormat.format(date);
    }

    return formattedDate;
}

您可以在结果中再添加 4 个月

java.time 和 ThreeTenABP

    DateTimeFormatter jsonDateFormatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSS");
    DateTimeFormatter turkishDateFormatter
            = DateTimeFormatter.ofPattern("EEEE MMM d", Locale.forLanguageTag("tr"));
    ZoneId zone = ZoneId.of("Europe/Istanbul");

    String dateFromJson = "2019-11-27 14:42:23.000000";
    String timezoneTypeFromJson = "3";
    String timezoneFromJson = "UTC";

    if (! timezoneTypeFromJson.equals("3")) {
        throw new IllegalStateException("This Stack Overflow answer only supports timezone_type 3");
    }
    LocalDateTime ldt = LocalDateTime.parse(dateFromJson, jsonDateFormatter);
    ZoneId jsonZone = ZoneId.of(timezoneFromJson);
    ZonedDateTime dateTime = ldt.atZone(jsonZone).withZoneSameInstant(zone);
    ZonedDateTime futureDateTime = dateTime.plusMonths(4);
    String wantedDateString = futureDateTime.format(turkishDateFormatter);

    System.out.println(wantedDateString);

输出是期望的:

Cuma Mar 27

(土耳其语 3 月 27 日星期五

根据this answer timezone_type 3真正表示形式为region/city的时区ID,例如Europe/London 或 Etc/UTC。 UTCEtc/UTC 的别名,所以也可以。

如果您不想要伊斯坦布尔时区的结果,只需在代码中填写一个不同的时区即可。

SimpleDateFormat 是出了名的麻烦,也无法解析秒数为 6 位小数的日期时间字符串(它仅支持 3 位小数)。它也已经过时了。 DateCalendar 也设计得很差,而且早就过时了。而不是那些 类 我正在使用 java.time,现代 Java 日期和时间 API.

或者使用内置的本地化格式

您希望打印的日期不包含星期几和年份。为此,您需要像我上面那样手动指定格式。所以主要是为了其他读者:对于大多数目的来说,内置格式是合适的,并且有两个潜在的优势:它很符合用户的期望,并且很适合国际化。例如:

    DateTimeFormatter turkishDateFormatter = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.LONG)
            .withLocale(Locale.forLanguageTag("tr"));

27 Mart 2020 Cuma

或更短:

    DateTimeFormatter turkishDateFormatter = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.MEDIUM)
            .withLocale(Locale.forLanguageTag("tr"));

27.Mar.2020

问题:java.time 不需要 Android API 26 级吗?

java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置了现代 API。
  • 非Android Java 6 和 7 获得 ThreeTen Backport,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接