将字符串解析为数据并检索小时数

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 来查找输入字符串的模式) .