【问题标题】:How do I validate a timestamp?如何验证时间戳?
【发布时间】:2011-08-19 15:03:09
【问题描述】:

我的应用程序接受像这样的字符串“2002-10-15 10:55:01.000000”。我需要验证该字符串对于 db2 时间戳是否有效。

我该怎么做?

编辑:这主要是可行的

     public static boolean isTimeStampValid(String inputString) {
     SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
        try {
            format.parse(inputString);
            return true;
        } catch (ParseException e) {
            return false;
        }
     }

问题是,如果我将错误的格式传递给它,例如“2011-05-02 10:10:01.0av”,这将通过验证。我假设由于第一个毫秒字符是有效的,那么它只会截断字符串的其余部分。

【问题讨论】:

    标签: java db2 timestamp


    【解决方案1】:

    我不太确定格式,但您可以尝试一下并尝试类似的方法

    public static bool isTimeStampValid(String inputString)
    { 
        SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
        try{
           format.parse(inputString);
           return true;
        }
        catch(ParseException e)
        {
            return false;
        }
    }
    

    编辑:如果您想在成功解析后验证数字,您可以这样做

           format.parse(inputString);
           Pattern p = Pattern.compile("^\\d{4}[-]?\\d{1,2}[-]?\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}[.]?\\d{1,6}$");
           return p.matcher(inputString).matches();
    

    而不是

       format.parse(inputString);
       return true;
    

    【讨论】:

    • 我相信它会抛出 ParseException 而不是 FormatException
    • @Bill 你是对的,看起来 parse() 中发生了一些截断,但你可以在调用 parse() 后使用正则表达式来验证数字。
    • 我实际上只是抓住了最后 6 个字符并做了这个 Integer.parseInt(inputString.substring(20));
    • @Bill 也可以,但也可以查看正则表达式解决方案 :)
    • 另一个奇怪的事情,如果我设置 format.setLenient(false);它总是无法解析。
    【解决方案2】:

    http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

    我相信格式是"yyyy-MM-dd HH:mm:ss.SSSSSS"

    调用 parse(String) 并捕获 ParseException 指示它无效。

    【讨论】:

      【解决方案3】:
      /**
       * This method validates the given time stamp in String format
       * @param timestamp
       * @return
       */
      
      public static boolean isTimeStampValid(String timestamp) {
          //(Considering that formal will be yyyy-MM-dd HH:mm:ss.SSSSSS )
          //Tokenize string and separate date and time
          boolean time = false;
          try {
                  //Tokenize string and separate date and time
                  StringTokenizer st = new StringTokenizer(timestamp, " ");
      
                  if (st.countTokens() != 2) {
                      return false;
                  }
      
                  String[] dateAndTime = new String[2];
      
                  int i = 0;
                  while (st.hasMoreTokens()) {
                      dateAndTime[i] = st.nextToken();
                      i++;
                  }
      
                  String timeToken = dateAndTime[1];
      
                  StringTokenizer timeTokens = new StringTokenizer(timeToken, ":");
                  if (timeTokens.countTokens() != 3) {
                      return false;
                  }
      
                  String[] timeAt = new String[4];
                  int j = 0;
                  while (timeTokens.hasMoreTokens()) {
                      timeAt[j] = timeTokens.nextToken();
                      j++;
                  }
                  try {
                          int HH = Integer.valueOf(timeAt[0].toString());
                          int mm = Integer.valueOf(timeAt[1].toString());
                          float ss = Float.valueOf(timeAt[2].toString());
      
      
                          if (HH < 60 && HH >= 0 && mm < 60 && mm >= 0 && ss < 60 && ss >= 0) {
                              time = true;
                          } else {
                          }
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  //Got Date
                  String dateToken = dateAndTime[0];//st.nextToken();
      
                  //Tokenize separated date and separate year-month-day
                  StringTokenizer dateTokens = new StringTokenizer(dateToken, "-");
                  if (dateTokens.countTokens() != 3) {
                      return false;
                  }
                  String[] tokenAt = new String[3];
      
                  //This will give token string array with year month and day value.
                  int k = 0;
                  while (dateTokens.hasMoreTokens()) {
                      tokenAt[k] = dateTokens.nextToken();
                      k++;
                  }
      
                  //Now try to create new date with got value of date
                  int dayInt = Integer.parseInt(tokenAt[2]);
                  int monthInt = Integer.parseInt(tokenAt[1]);
                  int yearInt = Integer.parseInt(tokenAt[0]);
                  Calendar cal = new GregorianCalendar();
                  cal.setLenient(false);
                  cal.set(yearInt, monthInt - 1, dayInt);
                  cal.getTime();//If not able to create date it will throw error
      
      
      
          } catch (Exception e) {
              e.printStackTrace();
              return false;
          }
          //Here we ll check for correct format is provided else it ll return false
          try {
                  Pattern p = Pattern.compile("^\\d{4}[-]?\\d{1,2}[-]?\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}[.]?\\d{1,6}$");
                  if (p.matcher(timestamp).matches()) {
                  } else {
                      return false;
                  }
      
          } catch (Exception e) {
              e.printStackTrace();
              return false;
          }
          //Cross checking with simple date format to get correct time stamp only
          SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
          try {
                  format.parse(timestamp);
                  //return true;
      
                  if (time) {
                      return true;
                  } else {
                      return false;
                  }
          } catch (ParseException e) {
              e.printStackTrace();
              return false;
          } catch (Exception e) {
              e.printStackTrace();
              return false;
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        如果您已经连接到数据库,您可以执行一个尝试将输入字符串转换为时间戳的查询,并检查失败消息(在本例中为 SQLSTATE 22007)。

        VALUES CAST( ? AS TIMESTAMP )
        

        上述查询将完全验证输入字符串,同时几乎不会消耗数据库服务器上的任何资源。如果字符串因任何原因无效,您的数据库客户端将遇到异常。

        【讨论】:

          猜你喜欢
          • 2021-12-01
          • 2016-05-29
          • 2022-11-24
          • 2012-09-07
          • 2016-08-05
          • 2015-11-04
          • 1970-01-01
          • 2011-10-07
          • 1970-01-01
          相关资源
          最近更新 更多