转换时间格式

标签 c date

在下面的代码中,我尝试通过将 UTC 转换为本地时间来打印时间。即添加 5:30 分钟。现在我想将本地时间转换为 UTC。如果我低于 5:30 分钟,则实际时间和更改后的时间之间有 45 的差异。

#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527
static int MNTH_DAYS[12]={
  31,28,31,30,31,30,31,31,30,31,30,31};
float tzone=5.5;
static long tzone_offset_s = tzone*3600UL;
static int dd;
static int mm;
static int yy;
static int s;
static int h;
static int m;
static int wkDay;
int CENTURY=2000;
static int local_day;
static int local_month;
static int local_year;
int local_s;
static int local_h;
static int local_m;


void setup(){
  Wire.begin();
  Serial.begin(9600);
  s=10;
  m=9;
  h=5;
  yy=14;
  mm=3;
  dd=15;
  wkDay;
  rtcWrite();      
}

void loop(){
  getRTCDateTime();
  convertUTCtoLocal();
  Print_Date_time();

  delay(1000);
}

void rtcWrite(){    
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator

  Wire.write(decToBcd(s));
  Wire.write(decToBcd(m));
  Wire.write(decToBcd(h));
  Wire.write(decToBcd(wkDay));
  Wire.write(decToBcd(dd));
  Wire.write(decToBcd(mm));
  Wire.write(decToBcd(getLastTwoDigOfYear(yy)));

  Wire.write(zero); //start

  Wire.endTransmission();
}

int getLastTwoDigOfYear(int y){
  return(y%100); 
}

byte decToBcd(byte val){
  // Convert normal decimal numbers to binary coded decimal
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)  {
  // Convert binary coded decimal to normal decimal numbers
  return ( (val/16*10) + (val%16) );
}

void getRTCDateTime()
{
  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  s = bcdToDec(Wire.read());
  m = bcdToDec(Wire.read());
  h = bcdToDec(Wire.read() & 0b111111); //24 hour time
  wkDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  dd = bcdToDec(Wire.read());
  mm = bcdToDec(Wire.read());
  yy = CENTURY + bcdToDec(Wire.read());
}

void convertUTCtoLocal(){    
  long no_s_day_start= h*3600UL + m*60 + s; //no of seconds since day start
  long day_change_cutoff_s = 86400UL-tzone_offset_s;//max utc before changing date

  long additional_s;//additional seconds after day change

  local_year = yy;

  if(no_s_day_start>day_change_cutoff_s){
    if(dd+1 > MNTH_DAYS[mm-1]){
      local_day = 1;
      if(mm==12){
        local_month=1;
        local_year = yy+1;
      }
      else
        local_month = mm+1;
    }
    else{
      local_day=dd+1;
      local_month=mm;
    }

    additional_s = no_s_day_start - day_change_cutoff_s; 
    convertSecondsToLocalHMS(additional_s);
  }
  else{
    local_day = dd;
    local_month = mm;
    convertSecondsToLocalHMS(no_s_day_start+tzone_offset_s);
  }
}

void convertSecondsToLocalHMS(long secs){    
  local_h = secs/3600; //hour
  local_m=(secs%3600)/60;//min
  local_s = secs - local_h*3600UL - local_m*60;
}

int sign(int v)
{
  return v >= 0 ? 1 : -1;
}

void Print_Date_time(){
  Serial.print("Local Date:");
  Serial.print(local_day);
  Serial.print("/");
  Serial.print(local_month);
  Serial.print("/");
  Serial.print(local_year);
  Serial.print("\t");
  Serial.print("local_time is:");
  Serial.print(local_h);
  Serial.print("-");
  Serial.print(local_m);
  Serial.print("-");
  Serial.println(local_s);   
}

这个函数是我将值存储到 h、m、s 的地方

void setCustomDateTime(int date_time[])
{
  dd=date_time[0];
  mm=date_time[1];
  yy=date_time[2];
  h=date_time[3]-5;
  if(date_time[4]>0 && date_time[4]<=30)
  {
    m=date_time[4]-30;
  }
  else
  {
    m=date_time[4]-30;
    m=sign(m);
  }
  s=date_time[5];
  wkDay =2;
  rtcWrite(s,m,h,wkDay,dd,mm,yy);  
}
void rtcWrite(int sec1,int min1,int hour1, int  wkday1,int dd1,int mm1,int yy1)
{  
  rtcSetup();
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator
  Wire.write(decToBcd(sec1));
  Wire.write(decToBcd(min1));
  Wire.write(decToBcd(hour1));
  Wire.write(decToBcd(wkday1));
  Wire.write(decToBcd(dd1));
  Wire.write(decToBcd(mm1));
  // Wire.write(decToBcd(yy1);
  Wire.write(decToBcd(getLastTwoDigOfYear(yy1)));
  Wire.write(zero); //start
  Wire.endTransmission();
  getRTCDateTime();
  convertUTCtoLocal();
}

我查看了论坛:这里如何分离 float 并存储为整数。 Ntime 为浮点型

Time1=(3600*5)+(60*30);
Time2=(3600*date_time[3])+(60*date_time[4])+date_time[5];
Ntime=Time2-Time1;
Ntime=((Ntime%60)/100+(Ntime/60));

最佳答案

你试过吗

tzset();

检查This

希望这有帮助。 请留下反馈。

关于转换时间格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22321257/

相关文章:

c - 使用 ubuntu 执行迷你 shell

python - 如何将包含 7 位毫秒数的日期字符串转换为 Python 中的日期

ruby 日期 gem utc 偏移量

javascript - 这是确定日期范围是否在 Javascript 中从开始日期到一年以内结束的正确方法吗?

ios - 在 Firebase 数据库中有效地存储时间?

c - 在 c 中实现基本 Makefile 的麻烦

c - 表达式必须是指向使用简单指针算法的完整对象类型的指针

c - gcc 由于无法识别 __TIMESTAMP__ 和其他一些已定义的构建变量而生成编译时错误

c - C 中用于检查位的简单位掩码方法

javascript - 在输入字段中输入带有 dd/mm/yyyy 的日期格式