我現在正在開發一個 Windows 驅動的 C 專案。并且有一個函式可以將檔案名與其中的日期部分組合在一起。它使用wcsftime C 運行時庫函式用"%x"格式化代碼格式化日期部分。此代碼對應于
%x 語言環境的日期表示
正如檔案所說。
現在,我需要檢查哪些檔案與某些日期范圍匹配。所以,我需要將檔案名的這個日期部分決議回日期并執行比較。但是,我遇到了麻煩:如何做到這一點?我沒有找到任何可以完成這項作業的 CRT 功能。此外,對于我來說,獲得類似于當前語言環境的“dd-mm-yyyy”的格式化字串以便決議這個字串可能會更好。但我沒有找到任何方法來做到這一點。
我注意到了,它是關于 CRT 功能的。例如,它的語言環境不同于GetLocaleInfo使用的語言環境。
uj5u.com熱心網友回復:
最大的問題是,如果您知道創建字串中日期的語言環境。
如果您在同一臺機器上,那么您可以使用此處描述的time_get函式。
有了它,您可以獲得日期中日、月、年的順序。有了它,您可以首先構建一個std::regex來提取數字,然后將數字分配到相應的日期段中。
正則運算式可能看起來像 R"(\d{1,4}[.\/,;]\d{1,4}[.\/,;]\d{1,4})" 它將匹配 3 位數字由一些典型的日期分隔符分隔的組。
然后,通過了解日期順序,您可以從字串中提取日、月和年。
一些示例代碼:
#include <iostream>
#include <locale>
#include <string>
#include <regex>
#include <iomanip>
// Example for year/month/day formated string
std::string fileName{"file7_234x2021/5/23abc.txt"};
std::regex re{R"((\d )[\.\\\/\,\;](\d{1,4})[\.\\\/\,\;](\d{1,4}))"};
int main() {
std::smatch sm{};
if (std::regex_search(fileName,sm,re)) {
int year = std::stoi(sm[1]);
int month = std::stoi(sm[2]);
int day = std::stoi(sm[3]);
std::cout << std::right << std::setfill('0') << std::setw(2) << day << '-' << std::setw(2) << month
<< '-'<< std::setw(4) << year << '\n';
}
}
如果您不知道日期順序,那么您可能會遇到大問題,只能通過一些啟發式方法找出什么是什么。
例如
- 31以上的數字是年
- 12 以上的數字是天(或年)
但是,不知何故容易出錯。. .
uj5u.com熱心網友回復:
一個簡單的解決辦法是去前進:生成使用相同的模式的檔案名,但對于一個測驗日期2001-02-03。結果將告訴您年、月和日的順序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/338874.html
上一篇:如何在兩個指標之間列印字串?
下一篇:VSCode中的比較警告
