mirror of
https://github.com/pocoproject/poco.git
synced 2025-01-21 02:00:33 +01:00
enh(DateTimeParser): option to cleanup input string before parsing (#569).
This commit is contained in:
parent
233c1f771f
commit
bbd07b6cb7
@ -59,24 +59,28 @@ class Foundation_API DateTimeParser
|
|||||||
public:
|
public:
|
||||||
static void parse(const std::string& fmt, const std::string& str, DateTime& dateTime, int& timeZoneDifferential);
|
static void parse(const std::string& fmt, const std::string& str, DateTime& dateTime, int& timeZoneDifferential);
|
||||||
/// Parses a date and time in the given format from the given string.
|
/// Parses a date and time in the given format from the given string.
|
||||||
|
/// Performs cleanup of the input string (trims spaces).
|
||||||
/// Throws a SyntaxException if the string cannot be successfully parsed.
|
/// Throws a SyntaxException if the string cannot be successfully parsed.
|
||||||
/// Please see DateTimeFormatter::format() for a description of the format string.
|
/// Please see DateTimeFormatter::format() for a description of the format string.
|
||||||
/// Class DateTimeFormat defines format strings for various standard date/time formats.
|
/// Class DateTimeFormat defines format strings for various standard date/time formats.
|
||||||
|
|
||||||
static DateTime parse(const std::string& fmt, const std::string& str, int& timeZoneDifferential);
|
static DateTime parse(const std::string& fmt, const std::string& str, int& timeZoneDifferential);
|
||||||
/// Parses a date and time in the given format from the given string.
|
/// Parses a date and time in the given format from the given string.
|
||||||
|
/// Performs cleanup of the input string (trims spaces).
|
||||||
/// Throws a SyntaxException if the string cannot be successfully parsed.
|
/// Throws a SyntaxException if the string cannot be successfully parsed.
|
||||||
/// Please see DateTimeFormatter::format() for a description of the format string.
|
/// Please see DateTimeFormatter::format() for a description of the format string.
|
||||||
/// Class DateTimeFormat defines format strings for various standard date/time formats.
|
/// Class DateTimeFormat defines format strings for various standard date/time formats.
|
||||||
|
|
||||||
static bool tryParse(const std::string& fmt, const std::string& str, DateTime& dateTime, int& timeZoneDifferential);
|
static bool tryParse(const std::string& fmt, const std::string& str, DateTime& dateTime, int& timeZoneDifferential);
|
||||||
/// Parses a date and time in the given format from the given string.
|
/// Parses a date and time in the given format from the given string.
|
||||||
|
/// Performs cleanup of the input string (trims spaces).
|
||||||
/// Returns true if the string has been successfully parsed, false otherwise.
|
/// Returns true if the string has been successfully parsed, false otherwise.
|
||||||
/// Please see DateTimeFormatter::format() for a description of the format string.
|
/// Please see DateTimeFormatter::format() for a description of the format string.
|
||||||
/// Class DateTimeFormat defines format strings for various standard date/time formats.
|
/// Class DateTimeFormat defines format strings for various standard date/time formats.
|
||||||
|
|
||||||
static void parse(const std::string& str, DateTime& dateTime, int& timeZoneDifferential);
|
static void parse(const std::string& str, DateTime& dateTime, int& timeZoneDifferential);
|
||||||
/// Parses a date and time from the given dateTime string. Before parsing, the method
|
/// Parses a date and time from the given dateTime string. Before parsing, the method
|
||||||
|
/// performs cleanup of the input string (trims spaces) when cleanup is true and
|
||||||
/// examines the dateTime string for a known date/time format.
|
/// examines the dateTime string for a known date/time format.
|
||||||
/// Throws a SyntaxException if the string cannot be successfully parsed.
|
/// Throws a SyntaxException if the string cannot be successfully parsed.
|
||||||
/// Please see DateTimeFormatter::format() for a description of the format string.
|
/// Please see DateTimeFormatter::format() for a description of the format string.
|
||||||
@ -84,12 +88,14 @@ public:
|
|||||||
|
|
||||||
static DateTime parse(const std::string& str, int& timeZoneDifferential);
|
static DateTime parse(const std::string& str, int& timeZoneDifferential);
|
||||||
/// Parses a date and time from the given dateTime string. Before parsing, the method
|
/// Parses a date and time from the given dateTime string. Before parsing, the method
|
||||||
|
/// performs cleanup of the input string (trims spaces) and
|
||||||
/// examines the dateTime string for a known date/time format.
|
/// examines the dateTime string for a known date/time format.
|
||||||
/// Please see DateTimeFormatter::format() for a description of the format string.
|
/// Please see DateTimeFormatter::format() for a description of the format string.
|
||||||
/// Class DateTimeFormat defines format strings for various standard date/time formats.
|
/// Class DateTimeFormat defines format strings for various standard date/time formats.
|
||||||
|
|
||||||
static bool tryParse(const std::string& str, DateTime& dateTime, int& timeZoneDifferential);
|
static bool tryParse(const std::string& str, DateTime& dateTime, int& timeZoneDifferential);
|
||||||
/// Parses a date and time from the given dateTime string. Before parsing, the method
|
/// Parses a date and time from the given dateTime string. Before parsing, the method
|
||||||
|
/// performs cleanup of the input string (trims spaces) and
|
||||||
/// examines the dateTime string for a known date/time format.
|
/// examines the dateTime string for a known date/time format.
|
||||||
/// Please see DateTimeFormatter::format() for a description of the format string.
|
/// Please see DateTimeFormatter::format() for a description of the format string.
|
||||||
/// Class DateTimeFormat defines format strings for various standard date/time formats.
|
/// Class DateTimeFormat defines format strings for various standard date/time formats.
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include "Poco/DateTime.h"
|
#include "Poco/DateTime.h"
|
||||||
#include "Poco/Exception.h"
|
#include "Poco/Exception.h"
|
||||||
#include "Poco/Ascii.h"
|
#include "Poco/Ascii.h"
|
||||||
|
#include "Poco/String.h"
|
||||||
|
|
||||||
|
|
||||||
namespace Poco {
|
namespace Poco {
|
||||||
@ -42,10 +43,17 @@ namespace Poco {
|
|||||||
{ int i = 0; while (i < n && it != end && Ascii::isDigit(*it)) { var = var*10 + ((*it++) - '0'); i++; } while (i++ < n) var *= 10; }
|
{ int i = 0; while (i < n && it != end && Ascii::isDigit(*it)) { var = var*10 + ((*it++) - '0'); i++; } while (i++ < n) var *= 10; }
|
||||||
|
|
||||||
|
|
||||||
void DateTimeParser::parse(const std::string& fmt, const std::string& str, DateTime& dateTime, int& timeZoneDifferential)
|
inline std::string cleanedInputString(const std::string& str)
|
||||||
{
|
{
|
||||||
|
return Poco::trim(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DateTimeParser::parse(const std::string& fmt, const std::string& dtStr, DateTime& dateTime, int& timeZoneDifferential)
|
||||||
|
{
|
||||||
|
const auto str = cleanedInputString(dtStr);
|
||||||
|
|
||||||
if (fmt.empty() || str.empty() || (DateTimeFormat::hasFormat(fmt) && !DateTimeFormat::isValid(str)))
|
if (fmt.empty() || str.empty() || (DateTimeFormat::hasFormat(fmt) && !DateTimeFormat::isValid(str)))
|
||||||
throw SyntaxException("Invalid DateTimeString:" + str);
|
throw SyntaxException("Invalid DateTimeString:" + dtStr);
|
||||||
|
|
||||||
int year = 0;
|
int year = 0;
|
||||||
int month = 0;
|
int month = 0;
|
||||||
@ -223,8 +231,10 @@ DateTime DateTimeParser::parse(const std::string& str, int& timeZoneDifferential
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool DateTimeParser::tryParse(const std::string& str, DateTime& dateTime, int& timeZoneDifferential)
|
bool DateTimeParser::tryParse(const std::string& dtStr, DateTime& dateTime, int& timeZoneDifferential)
|
||||||
{
|
{
|
||||||
|
const auto str = cleanedInputString(dtStr);
|
||||||
|
|
||||||
if (str.length() < 4) return false;
|
if (str.length() < 4) return false;
|
||||||
|
|
||||||
if (str[3] == ',')
|
if (str[3] == ',')
|
||||||
|
@ -751,6 +751,28 @@ void DateTimeParserTest::testGuess()
|
|||||||
assertTrue (tzd == 0);
|
assertTrue (tzd == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DateTimeParserTest::testCleanup()
|
||||||
|
{
|
||||||
|
int tzd;
|
||||||
|
|
||||||
|
DateTime dt = DateTimeParser::parse("2005-01-08T12:30:00Z", tzd);
|
||||||
|
DateTime dt2 = DateTimeParser::parse(" 2005-01-08T12:30:00Z ", tzd);
|
||||||
|
|
||||||
|
assertTrue (dt == dt2);
|
||||||
|
|
||||||
|
assertTrue(DateTimeParser::tryParse(" 2005-01-08T12:30:00Z ", dt, tzd));
|
||||||
|
|
||||||
|
dt = DateTimeParser::parse(DateTimeFormat::ISO8601_FRAC_FORMAT, "2005-01-08T12:30:00.1Z", tzd);
|
||||||
|
dt2 = DateTimeParser::parse(DateTimeFormat::ISO8601_FRAC_FORMAT, "2005-01-08T12:30:00.1Z ", tzd);
|
||||||
|
|
||||||
|
assertTrue (dt == dt2);
|
||||||
|
|
||||||
|
assertTrue(DateTimeParser::tryParse(DateTimeFormat::ISO8601_FRAC_FORMAT, " 2005-01-08T12:30:00Z ", dt, tzd));
|
||||||
|
|
||||||
|
assertFalse(DateTimeParser::tryParse(DateTimeFormat::ISO8601_FRAC_FORMAT, " ", dt, tzd));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void DateTimeParserTest::testParseMonth()
|
void DateTimeParserTest::testParseMonth()
|
||||||
{
|
{
|
||||||
@ -790,7 +812,7 @@ void DateTimeParserTest::testParseMonth()
|
|||||||
month = DateTimeParser::parseMonth(it, str.end());
|
month = DateTimeParser::parseMonth(it, str.end());
|
||||||
fail("Not a valid month name - must throw");
|
fail("Not a valid month name - must throw");
|
||||||
}
|
}
|
||||||
catch (SyntaxException&)
|
catch (const SyntaxException&)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -834,7 +856,7 @@ void DateTimeParserTest::testParseDayOfWeek()
|
|||||||
dow = DateTimeParser::parseDayOfWeek(it, str.end());
|
dow = DateTimeParser::parseDayOfWeek(it, str.end());
|
||||||
fail("Not a valid weekday name - must throw");
|
fail("Not a valid weekday name - must throw");
|
||||||
}
|
}
|
||||||
catch (SyntaxException&)
|
catch (const SyntaxException&)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -877,6 +899,7 @@ CppUnit::Test* DateTimeParserTest::suite()
|
|||||||
CppUnit_addTest(pSuite, DateTimeParserTest, testSORTABLE);
|
CppUnit_addTest(pSuite, DateTimeParserTest, testSORTABLE);
|
||||||
CppUnit_addTest(pSuite, DateTimeParserTest, testCustom);
|
CppUnit_addTest(pSuite, DateTimeParserTest, testCustom);
|
||||||
CppUnit_addTest(pSuite, DateTimeParserTest, testGuess);
|
CppUnit_addTest(pSuite, DateTimeParserTest, testGuess);
|
||||||
|
CppUnit_addTest(pSuite, DateTimeParserTest, testCleanup);
|
||||||
CppUnit_addTest(pSuite, DateTimeParserTest, testParseMonth);
|
CppUnit_addTest(pSuite, DateTimeParserTest, testParseMonth);
|
||||||
CppUnit_addTest(pSuite, DateTimeParserTest, testParseDayOfWeek);
|
CppUnit_addTest(pSuite, DateTimeParserTest, testParseDayOfWeek);
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@ public:
|
|||||||
void testSORTABLE();
|
void testSORTABLE();
|
||||||
void testCustom();
|
void testCustom();
|
||||||
void testGuess();
|
void testGuess();
|
||||||
|
void testCleanup();
|
||||||
void testParseMonth();
|
void testParseMonth();
|
||||||
void testParseDayOfWeek();
|
void testParseDayOfWeek();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user