我尝试将此字符串“2014-07-23 09:00:00"
转换为此类"9 PM"
。我的代码是:
public void printTime() {
String data = "2014-07-23 09:00:00";
SimpleDateFormat f1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.UK);
SimpleDateFormat f2 = new SimpleDateFormat("ha",Locale.UK);
Log.v(LOG, "Time is" + f2.format(f1.format(data)));
}
但是有这个错误:
Caused by: java.lang.IllegalArgumentException
at java.text.DateFormat.format(DateFormat.java:365)
at java.text.Format.format(Format.java:93)
at launcher.alpentouch.com.myapplication.MainActivity.printTime(MainActivity.java:30)
at launcher.alpentouch.com.myapplication.MainActivity.onCreate(MainActivity.java:21)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:2)
不要害怕使用新的Java 8 Time API,因此您不会遇到意外调用SimpleDateFormat.format(Object)
等问题。
String data = "2014-07-23 09:00:00";
DateTimeFormatter sourceFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
DateTimeFormatter destinationFormatter = DateTimeFormatter.ofPattern("h a");
String output = LocalDateTime.parse(data, sourceFormatter).format(destinationFormatter);
答案 1 :(得分:1)
f2.format(f1.format(data))
当您尝试使用DateFormat格式化 String 时,毫无意义。这些对象解析字符串到日期和格式日期到字符串。因此,您可以使用DateFormat对象将String解析为Date,然后将结果格式化为String:
f2.format(f1.parse(data))
遇到此类错误时,最好不要尝试在一行上进行嵌套调用,因为这会使您更难找到错误。那么更好:
Date d = f1.parse(data);
String dateString = f2.format(d);
...至少在您修复错误之前。通过这种方式,您可以知道嵌套代码的哪一部分出错,因为JVM将直接指向违规行。
答案 2 :(得分:0)
我试过这个:
public static void main(String[] args) {
String dateString = "2014-07-23 09:00:00";
SimpleDateFormat sdf = new SimpleDateFormat("dd-M-yyyy hh:mm:ss");
try {
Date date = sdf.parse(dateString);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
System.out.println(calendar.get(Calendar.HOUR_OF_DAY) + " PM") ;
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
晚上9点
答案 3 :(得分:0)
读取您拥有的日期字符串,认为这是ISO模式(或简化形式) 使用此代码,您将获得所需内容:
public void printTime(){
// i think ISO allow a space between date and time, but our interpreter not
String data = "2014-07-23 13:00:00";
data = data.replace(' ', 'T'); // <<<--- Caution here!
SimpleDateFormat f1 = new SimpleDateFormat("h a", Locale.UK);
Calendar cad = javax.xml.bind.DatatypeConverter.parseDateTime(data);
System.out.printf("Your format: %s \n", f1.format( cad.getTime() ) );
}
javax.xml.bind.DatatypeConverter
可以解析此ISO模式(注意日期和时间之间的 T ),以及日历(和日期) ,从.getTime()
调用Calendar
),您可以格式化为您想要的内容。
但是,如果您需要一种能够获得不同日期格式的解决方案,那么您需要更加具体地了解这种格式。
此处使用javax.xml.bind.DatatypeConverter
的一个原因是此解析器可以接受ISO格式的&#34;不同形式&#34; 。所有这些都是该解析器的有效字符串:
- "2014-07-23"
- "2014-07-23T13:00:00"
- "2014-07-23T13:00:00.100Z"
只有SimpleDateFormat
你无法解析上面的字符串,因为SimpleDateFormat
没有足够的语法来声明如何解释&#34;不同的形式&#34; 输入日期字符串。因此,您最终会得到一个解决方案来检查输入字符串,以定义您需要使用的SimpleDateFormat
实例(可能使用RegExp查找输入字符串上的模式)。