Tôi không biết liệu có tin tặc Arduino nào khác sẽ vấp phải câu hỏi này hay không, nhưng tôi thấy câu trả lời của JerryCoffin khá hữu ích trong việc giải quyết vấn đề này cho dự án của tôi. Đây là một ví dụ hoàn chỉnh bạn có thể dán vào Arduino. Nó sử dụng Time lib referenced here.
#include "Arduino.h"
#include <Time.h>
#include <stdio.h>
time_t cvt_date(char const *date) {
char s_month[5];
int month, day, year;
tmElements_t tmel;
static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
sscanf(date, "%s %d %d", s_month, &day, &year);
month = (strstr(month_names, s_month)-month_names)/3+1;
tmel.Hour = tmel.Minute = tmel.Second = 0; // This was working perfectly until 3am then broke until I added this.
tmel.Month = month;
tmel.Day = day;
// year can be given as full four digit year or two digts (2010 or 10 for 2010);
//it is converted to years since 1970
if(year > 99)
tmel.Year = year - 1970;
else
tmel.Year = year + 30;
return makeTime(tmel);
}
void printdate(char const *date)
{
Serial.println((String)"cvt_date('" + date + "')");
time_t t = cvt_date(date);
Serial.println((String) month(t) + "-" + day(t) + "-" + year(t));
setTime(t);
Serial.println((String) month() + "/" + day() + "/" + year() + "\n");
}
void setup()
{
Serial.begin(9600); while (!Serial);
printdate(__DATE__); // works with the compiler macro
printdate("Jan 1 00"); // works with 2 digit years
printdate("Feb 28 01");
printdate("Mar 7 5"); // works with 1 digit years
printdate("Apr 10 1970"); // works from 1970
printdate("May 13 1980");
printdate("Jun 16 1990");
printdate("Jul 19 1997");
printdate("Aug 22 2000");
printdate("Sep 25 2010");
printdate("Oct 31 2014");
printdate("Nov 30 2020");
printdate("Dec 31 2105"); // through 2105
printdate("Dec 31 2106"); // fails at and after 2106
}
void loop(){
}
Đây là kết quả ga Serial ...
cvt_date('Oct 5 2014')
10-5-2014
10/5/2014
cvt_date('Jan 1 00')
1-1-2000
1/1/2000
cvt_date('Feb 28 01')
2-28-2001
2/28/2001
cvt_date('Mar 7 5')
3-7-2005
3/7/2005
cvt_date('Apr 10 1970')
4-10-1970
4/10/1970
cvt_date('May 13 1980')
5-13-1980
5/13/1980
cvt_date('Jun 16 1990')
6-16-1990
6/16/1990
cvt_date('Jul 19 1997')
7-19-1997
7/19/1997
cvt_date('Aug 22 2000')
8-22-2000
8/22/2000
cvt_date('Sep 25 2010')
9-25-2010
9/25/2010
cvt_date('Oct 31 2014')
10-31-2014
10/31/2014
cvt_date('Nov 30 2020')
11-30-2020
11/30/2020
cvt_date('Dec 31 2105')
12-31-2105
12/31/2105
cvt_date('Dec 31 2106')
11-23-1970
11/23/1970
Nếu tất cả các bạn muốn là sử dụng __DATE__
và bạn không cần một time_t
hoặc tmElements_t
đối tượng, các mã có thể được đơn giản hơn nhiều .
void logname(char const *date, char *buff) {
int month, day, year;
static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
sscanf(date, "%s %d %d", buff, &day, &year);
month = (strstr(month_names, buff)-month_names)/3+1;
sprintf(buff, "%d%02d%02d.txt", year, month, day);
}
void setup()
{
Serial.begin(9600); while (!Serial);
Serial.print("log file name: ");
char filename[16];
logname(__DATE__, filename);
Serial.println(filename);
}
void loop(){
}
Đây là kết quả ga Serial ...
log file name: 20141009.txt
Một điều lớn - tháng 'trả về' bởi '__DATE__' có dạng tên ('Jan', 'Feb', v.v ...). Một gợi ý nhỏ khác: bạn nên đặt 't.tm_dst = -1' để' mktime() 'sẽ cố gắng sử dụng DST thích hợp. –
@Michael - có vẻ như t.tm_dst không phải là một phần của visual C++. – tfinniga
Tôi xin lỗi - đó phải là 't.tm_isdst = -1' –