将字符串解析为数据并检索小时数
Parse string to data and retrieve hours
我正在尝试将此字符串“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.access0(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)
f2.format(f1.format(data))
没有任何意义,因为您正在尝试使用 DateFormat 来格式化 String。这些对象 parse 字符串到日期和 format 日期到字符串。因此,您可以使用 DateFormat 对象将字符串解析为日期,然后将结果格式化回字符串:
f2.format(f1.parse(data))
当 运行 出现此类错误时,最好不要尝试在一行中进行嵌套调用,因为这会使您更难找到错误。更好:
Date d = f1.parse(data);
String dateString = f2.format(d);
...至少在您修复错误之前。这样您就可以知道嵌套代码的哪一部分出错了,因为 JVM 将直接指向有问题的行。
好吧,我试过了:
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 点
不要害怕使用新的 Java 8 次 API 这样您就不会 运行 遇到诸如意外调用 SimpleDateFormat.format(Object)
.[=12= 之类的问题]
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);
阅读您拥有的日期字符串,认为这是 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),并用日历 (和日期,从 Calendar
调用 .getTime()
) 你可以格式化成你想要的格式。
但是如果您需要一个接收不同类型日期格式的解决方案,您将需要更具体地了解这种格式。
这里使用javax.xml.bind.DatatypeConverter
的原因之一是这个解析器可以接受ISO格式的"diferent forms"。所有这些都是该解析器的有效字符串:
- "2014-07-23"
- "2014-07-23T13:00:00"
- "2014-07-23T13:00:00.100Z"
只有 SimpleDateFormat
你不能解析上面的字符串,因为 SimpleDateFormat
没有足够灵活的语法来声明如何解释 "different forms" 输入日期字符串。因此,您最终得到了一个解决方案,该解决方案对输入字符串进行检查以定义您需要使用的 SimpleDateFormat
实例是什么 (可能使用 RegExp 来查找输入字符串的模式) .
我正在尝试将此字符串“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.access0(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)
f2.format(f1.format(data))
没有任何意义,因为您正在尝试使用 DateFormat 来格式化 String。这些对象 parse 字符串到日期和 format 日期到字符串。因此,您可以使用 DateFormat 对象将字符串解析为日期,然后将结果格式化回字符串:
f2.format(f1.parse(data))
当 运行 出现此类错误时,最好不要尝试在一行中进行嵌套调用,因为这会使您更难找到错误。更好:
Date d = f1.parse(data);
String dateString = f2.format(d);
...至少在您修复错误之前。这样您就可以知道嵌套代码的哪一部分出错了,因为 JVM 将直接指向有问题的行。
好吧,我试过了:
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 点
不要害怕使用新的 Java 8 次 API 这样您就不会 运行 遇到诸如意外调用 SimpleDateFormat.format(Object)
.[=12= 之类的问题]
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);
阅读您拥有的日期字符串,认为这是 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),并用日历 (和日期,从 Calendar
调用 .getTime()
) 你可以格式化成你想要的格式。
但是如果您需要一个接收不同类型日期格式的解决方案,您将需要更具体地了解这种格式。
这里使用javax.xml.bind.DatatypeConverter
的原因之一是这个解析器可以接受ISO格式的"diferent forms"。所有这些都是该解析器的有效字符串:
- "2014-07-23"
- "2014-07-23T13:00:00"
- "2014-07-23T13:00:00.100Z"
只有 SimpleDateFormat
你不能解析上面的字符串,因为 SimpleDateFormat
没有足够灵活的语法来声明如何解释 "different forms" 输入日期字符串。因此,您最终得到了一个解决方案,该解决方案对输入字符串进行检查以定义您需要使用的 SimpleDateFormat
实例是什么 (可能使用 RegExp 来查找输入字符串的模式) .