我在android上的SimpleDatFormat工作。我尝试将时间从美国转换为瑞典。它在模拟器中工作得很好,但当我在三星设备上测试它时,它不工作。在其他设备和版本上运行良好。
SimpleDateFormat inputFormat = new SimpleDateFormat("hh:mm a", Locale.US);
SimpleDateFormat outputFormat = new SimpleDateFormat("hh:mm a", new Locale("sv"));
try {
return outputFormat.format(inputFormat.parse(date));
} catch (ParseException e) {e.printStackTrace();}
return null;
实际结果
示例输入:- 06:45 AM
模拟器中的O/p:- 06:45 FM
O/p在实际设备:- 06:45 AM
预期结果
示例输入:- 06:45 AM
模拟器中的O/p:- 06:45 FM
O/p在实际设备:- 06:45 FM
注意:此问题仅发生在时间区域设置转换中。日期转换在真实设备和仿真设备中都能很好地工作。
提前感谢。
首先,java.util日期时间API和它们的格式化API,SimpleDateFormat
是过时的和容易出错的。建议完全停止使用它们并切换到现代日期时间API。
无论您使用哪种API,问题的最可能原因是用一个参数初始化Locale
。你应该用new Locale("sv","SE")
而不是new Locale("sv")
。
java演示。时间API:
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter parser = DateTimeFormatter.ofPattern("hh:mm a", Locale.US);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a", new Locale("sv", "SE"));
LocalTime time = LocalTime.parse("06:45 AM", parser);
String formatted = time.format(formatter);
System.out.println(formatted);
}
}
:
06:45 fm
从Trail: Date Time了解更多关于现代Date-Time API的信息.
Arvind Kumar Avinash的答案是正确而聪明的。
另外,我们可以让java。Time自动本地化而不是硬编码格式。
<标题>自动定位tl;博士
localTime
.format(
DateTimeFormatter
.ofLocalizedTime( FormatStyle.SHORT )
.withLocale( new Locale( "sv" , "SE" ) ) // Swedish language, Sweden culture.
)
查看此代码运行在Ideone.com。
06:45
详细信息你似乎只对小时和分钟感兴趣,而对秒或分数秒不感兴趣。所以我们可以截断值
LocalTime localTime = localTime.truncatedTo( ChronoUnit.MINUTES ) ;
我们可以检查一些区域设置,以进行比较。我们将尝试瑞典、美国和加拿大(法国)。
List < Locale > locales = List.of( new Locale( "sv" , "SE" ) , Locale.US , Locale.CANADA_FRENCH );
循环区域设置。对于每个语言环境,循环各种FormatStyle
枚举对象,这些对象只能使用一天中的时间值(SHORT
&MEDIUM
)。
for ( Locale locale : locales )
{
System.out.println( "-------| " + locale + " |--------" );
for ( FormatStyle formatStyle : List.of( FormatStyle.SHORT , FormatStyle.MEDIUM ) )
{
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedTime( formatStyle ).withLocale( locale );
String output = localTimeTruncated.format( formatter );
System.out.println( formatter + " ➠ " + output );
}
}
运行时:
localTime = 06:45:07
localTimeTruncated = 06:45
-------| sv_SE |--------
Localized(,SHORT) ➠ 06:45
Localized(,MEDIUM) ➠ 06:45:00
-------| en_US |--------
Localized(,SHORT) ➠ 6:45 AM
Localized(,MEDIUM) ➠ 6:45:00 AM
-------| fr_CA |--------
Localized(,SHORT) ➠ 06 h 45
Localized(,MEDIUM) ➠ 06 h 45 min 00 s
标题>