回答
解析通常是在流,而不是字符串做,但你可以使用一個stringstream
。現在
std::istringstream date_s("04\\10\\1984");
struct tm date_c;
date_s >> std::get_time(&date_c, "%d\\%m\\%Y");
std::time_t seconds = std::mktime(& date_c);
您可以使用<
,以確定哪些早期是比較秒。
注意,std::get_time
在C++ 11是新的。它是根據strptime
定義的,它來自POSIX但不是C99標準的一部分。如果C++ 11庫不可用,則可以使用strptime
。如果你很勇敢,你也可以使用std::time_get
方面......雖然這很醜陋。
如果您不想知道除此之外的其他日期的任何信息,可以使用std::lexicographical_compare
。這將是一個單線,但功能名稱是如此之久。
// return true if the date string at lhs is earlier than rhs
bool date_less_ddmmyyyy(char const *lhs, char const *rhs) {
// compare year
if (std::lexicographical_compare(lhs + 6, lhs + 10, rhs + 6, rhs + 10))
return true;
if (! std::equal(lhs + 6, lhs + 10, rhs + 6))
return false;
// if years equal, compare month
if (std::lexicographical_compare(lhs + 3, lhs + 5, rhs + 3, rhs + 5))
return true;
if (! std::equal(lhs + 3, lhs + 5, rhs + 3))
return false;
// if months equal, compare days
return std::lexicographical_compare(lhs, lhs + 2, rhs);
}
對於std :: get_time示例,在Visual Studio 2013中,我需要首先將tm結構memset爲零,以便讓mktime工作。例如:memset(&date_c,0,sizeof(date_c)); – bossbarber
你需要從一個字符串中提取數字數據。最糟糕的情況是一堆循環和字符串到整數轉換函數。
你可以用的sscanf和sprintf很容易做到這一點。如果你已經習慣了printf
和scanf
那麼這很容易理解,你可以很容易地適應其他案件。沒有祕密的魔法函數調用。
#include <stdio.h>
void main()
{
char* date1 = "9\\12\\2012";
char* date2 = "6\\11\\2013";
int day1,month1,year1;
int day2,month2,year2;
sscanf(date1,"%d\\%d\\%d",&day1,&month1,&year1); //reads the numbers
sscanf(date2,"%d\\%d\\%d",&day2,&month2,&year2); //from the string
if (year1<year2 || month1<month2 || day1<day2) //compares 2 dates
{
printf("date1 < date2\n");
}
else
{
printf("date1 >= date2\n");
}
char newdate[15];
sprintf(newdate,"%d\\%d\\%d",13,2,1998); //make a date string from numbers
printf("%s\n",newdate);
}
如果這真的是一個固定的格式,你可以用簡單的C字符串比較
int date_cmp(const char *d1, const char *d2)
{
int rc;
// compare years
rc = strncmp(d1 + 6, d2 + 6, 4);
if (rc != 0)
return rc;
// compare months
rc = strncmp(d1 + 3, d2 + 3, 2);
if (rc != 0)
return rc;
// compare days
return strncmp(d1, d2, 2);
}
這就像strncmp
做到這一點。如果d1
早於d2
,則返回小於0的值;如果兩者都是相同日期,則返回0;如果d1
晚於d2
,則返回大於0的值。
另一種方法是將它與strptime
和mktime
轉換爲time_t
與difftime
struct tm tm;
time_t t1, t2;
strptime(d1, "%d\\%m\\%Y", &tm);
t1 = mktime(&tm);
// do the same with d2
double diff = difftime(t1, t2);
如何比較這大約一個有效的解決方案?如果您忽略斜槓,您的固定大小日期只需要8個字符。所以通過一些移位和字節交換,你可以將它們比作64位整數。這比比較字符串要快。
using std::cout;
using std::endl;
typedef unsigned __int16 U2;
typedef unsigned __int32 U4;
typedef unsigned __int64 U8;
#define bswap2 _byteswap_ushort
#define bswap4 _byteswap_ulong
#define bswap8 _byteswap_uint64
const int YYYYMMDD = 0;
const int YYYY_MM_DD = 1;
const int DDMMYYYY = 2;
const int DD_MM_YYYY = 3;
// compiler will optimize the if's out.
template <int FMT>
U8 DateToInt(char* sz) {
if (FMT == YYYYMMDD) {
return bswap8(*(U8*)sz);
}
if (FMT == YYYY_MM_DD) {
U4 y = *(U4*)sz, m = *(U2*)(sz + 5), d = *(U2*)(sz + 8);
return ((U8)bswap4(y) << 32) | (bswap2(m) << 16) | bswap2(d);
}
if (FMT == DD_MM_YYYY) {
U4 y = *(U4*)(sz + 6), m = *(U2*)(sz + 3), d = *(U2*)sz;
return ((U8)bswap4(y) << 32) | (bswap2(m) << 16) | bswap2(d);
}
}
template<int FMT1, int FMT2 = FMT1>
__int64 CompareDate(char* sz1, char* sz2) {
return DateToInt<FMT1>(sz1) - DateToInt<FMT2>(sz2);
}
void main() {
cout << CompareDate<YYYYMMDD>("20151025", "20151026") << endl;
cout << CompareDate<YYYYMMDD>("20151025", "20151024") << endl;
cout << CompareDate<YYYYMMDD, YYYY_MM_DD>("20151025", "2015/10/26") << endl;
cout << CompareDate<YYYYMMDD, YYYY_MM_DD>("20151025", "2015/10/24") << endl;
cout << CompareDate<YYYYMMDD, DD_MM_YYYY>("20151025", "26/10/2015") << endl;
cout << CompareDate<YYYYMMDD, DD_MM_YYYY>("20151025", "24/10/2015") << endl;
}
輸出
-1
1
-1
1
-1
1
- 1. Objective-C比較2日期
- 2. 比較兩個(2)日期
- 3. 比較2個日期
- 4. c#,比較日期
- 5. 在C中比較日期#
- 6. 在C++中比較日期
- 7. PHP日期比較(2周)
- 8. mysql比較2日期
- 9. Linq比較2日期
- 10. 比較兩個日期在objective-c
- 11. 如何比較兩個日期在c#
- 12. 比較兩個日期在C#
- 13. XSD 1.1比較2個日期
- 14. >的Javascript比較2個日期
- 15. JavaScript代碼比較2個日期
- 16. 比較2個日期與條件
- 17. c#比較日期時間和其他2日期
- 18. PostgreSQL和C++ - 比較日期
- 19. ASP.NET C#日期比較
- 20. iphone,objective c - 日期比較
- 21. 如何比較日期c#
- 22. C#比較日期範圍
- 23. 目標C,比較兩個日期
- 24. C++比較2個日期和檢查分差
- 25. 如何比較C++中的2個日期
- 26. 在日誌文件中比較2個日期
- 27. 比較日期
- 28. 日期比較
- 29. 比較日期
- 30. 日期比較
相關:http://stackoverflow.com/questions/1650715/c-standard-date-time-class。我寫了自己的日期類來做這些操作。你也可以輕鬆做到這一點。 – AgA
還檢查出支持一些日期和時間實用程序的C++ 11s new * chrono *頭。 – Snps
反斜槓,而不是正斜槓? – Potatoswatter