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

时间:2017-03-11 21:03:51

标签: java date simpledateformat

我尝试将此字符串“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)

4 个答案:

答案 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查找输入字符串上的模式)