无法将字符串转换为西班牙语日期



我正在尝试使用SimpleDateFormat()将表示日期"2017-05-22"的字符串解析为Date()。我还需要用西班牙语进行日期转换,所以我正在创建一个具有西班牙语配置的Locale。问题是,由于某种原因,我仍然可以用英语输出。我的手机语言&默认情况下,输入配置为英语,但我也尝试将其更改为西班牙语。这是完整的代码:

val localeSpanish = Locale("es", "ES")
val dateFormat = SimpleDateFormat("yyyy-MM-dd", localeSpanish)
val dateInSpanish = dateFormat.parse("2017-01-29")

我在输出中得到了这个:

Wed Jan 11 00:00:00 GMT-04:00 2017

有人能告诉我我做错了什么吗?

正如其他人所说,当您输出dateInSpanish时,您暴露了一个Date实例,该实例正在调用其toString方法,其实现基于包含英语中单词的静态数组构造该字符串

//From java.util.Date
private final static String wtb[] = {
"am", "pm",
"monday", "tuesday", "wednesday", "thursday", "friday",
"saturday", "sunday",
"january", "february", "march", "april", "may", "june",
"july", "august", "september", "october", "november", "december",
"gmt", "ut", "utc", "est", "edt", "cst", "cdt",
"mst", "mdt", "pst", "pdt"
};

当您声明dateFormatter时,它意味着将日期/字符串转换为以下示例:

val dateFormatter = SimpleDateFormat("yyyy-MM-dd", localeSpanish)
println(dateFormatter.parse("2017-01-29")) // prints: Wed Jan 29 00:00:00 GMT-02:00 2017
println(dateFormatter.format(Date()) // prints: 2018-07-27 (as today :p)

我认为您应该使用不同的掩码来获得格式化的字符串。但是,如果您被迫以这种格式读取日期,则必须声明两个格式化程序:

val readerFormatter = SimpleDateFormat("yyyy-MM-dd", localeSpanish)
val writerFormatter = SimpleDateFormat("d 'de' MMMM 'del' yyyy", localeSpanish)
val readDate: Date = readerFormatter.parse("2017-01-29")
val dateInSpanish: String = writerFormatter.format(readDate)
println(dateInSpanish) // prints: 29 de enero del 2017 (as today :p)

对不起,我还不能写Kotlin。你能翻译成Java吗?

Locale localeSpanish = new Locale("es", "ES");
DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG)
.withLocale(localeSpanish);
LocalDate date = LocalDate.parse("2017-01-29");
String formattedDate = date.format(dateFormatter);
System.out.println("Fecha en español: " + formattedDate);

此打印:

Fecha en español:29 de enero de 2017

消息:

  • 您使用的日期-时间类SimpleDateFormatDate已经过时很久了,而且设计得很差。SimpleDateFormat尤其以麻烦著称。尽管名称是Date,但它代表的是时间点,而不是日期。相反,使用现代java日期和时间API java.time
  • 对于没有时间的日期,请使用LocalDate
  • 您正在解析的格式yyyy-MM-dd是ISO 8601。现代类将ISO8601解析为默认值,也就是说,没有任何显式格式化程序
  • 无论您使用Date还是LocalDate,它们既没有格式也没有区域设置。它们保存数据的方式与int保存没有任何格式或区域设置的数字的方式非常相似。无论您有intDate还是LocalDate,如果您想要特定的格式,则只能在String中使用该格式
  • 要在区域设置中为受众设置日期格式,请使用内置日期格式。DateTimeFormatter.ofLocalizedDate为您提供了一个语言环境,但您需要将其转换为所需的语言环境

问题:我可以在Android上使用java.time吗

是的,java.time在较旧和较新的Android设备上都能很好地工作。它只需要至少Java6

  • 在Java 8和更高版本中,以及在较新的Android设备上(据我所知,从API 26级开始(,现代API是内置的
  • 在Java6和7中,获得ThreeTen Backport,即新类的Backport(JSR310的ThreeTen;请参阅底部的链接(
  • 在(旧的(安卓系统上使用安卓版的ThreeTen Backport。它被称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类

链接

  • Oracle教程:日期-时间,解释如何使用java.time
  • Java规范请求(JSR(310,其中首次描述了java.time
  • ThreeTen Backport项目,java.time到Java 6和7的Backport(JSR-310的ThreeTen(
  • ThreeTenABP,安卓版ThreeTen背包
  • 问题:如何在Android项目中使用ThreeTenABP,有一个非常彻底的解释
  • 维基百科文章:ISO 8601

Simple,SimpleDateFormat.parse返回一个与格式无关的Date对象。您要做的是打印以下内容:

val dateString = dateFormat.format(dateInSpanish)

尝试将其用于日期表示,并使用您的当地西班牙语val 来表示当地西班牙语时间

Calendar c = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("yyyy MMM dd - HH:mm:ss",*your code here*);
String formattedDate = df.format(c.getTime());

行:
val dateInSpanish = dateFormat.parse("2017-01-29")
不格式化日期,它只是从字符串中提取日期
线路:

val localeSpanish = Locale("es", "ES")

不会更改手机的配置
,因此您有一个日期:dateInSpanish你可以随心所欲地格式化它,然后打印

最新更新