- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试制作一个可以确定直到特定日期开始的秒数的计算器。
我目前能够确定当前的日期和时间,但是我不确定如何确定直到我想要的 future 一天开始的秒数(例如,星期六)。
我在想我可以计算出距周六还有多少天,然后将其转换为秒,但是问题是可能要增加额外的时间(我想知道午夜的时间,开始于一天)。
有人知道这怎么可能吗?
#pragma once
#include <string>
#include <ctime>
class DateTime
{
public:
DateTime();
DateTime(
const time_t& specific_datetime);
const std::string GetWeekDay() const;
const std::string GetMonth() const;
int GetDate() const;
const int GetSecondsUntilNextWeekDay(
const std::string& day_name) const;
private:
const int GetWeekDayNumberFromName(
const std::string& name) const;
tm m_time;
const time_t m_datetime;
DateTime(const DateTime &rhs);
DateTime &operator=(const DateTime &rhs);
};
#include "DateTime.h"
DateTime::DateTime() :
m_datetime(std::time(NULL))
{
localtime_s(&m_time, &m_datetime);
}
DateTime::DateTime(
const time_t& specific_datetime) :
m_datetime(specific_datetime)
{
localtime_s(&m_time, &m_datetime);
}
const std::string DateTime::GetWeekDay() const
{
switch (m_time.tm_wday)
{
case 0:
return "Sunday";
case 1:
return "Monday";
case 2:
return "Tuesday";
case 3:
return "Wednesday";
case 4:
return "Thursday";
case 5:
return "Friday";
case 6:
return "Saturday";
default:
return "Sunday";
}
}
const std::string DateTime::GetMonth() const
{
switch (m_time.tm_mon)
{
case 0:
return "January";
case 1:
return "February";
case 2:
return "March";
case 3:
return "April";
case 4:
return "May";
case 5:
return "June";
case 6:
return "July";
case 7:
return "August";
case 8:
return "September";
case 9:
return "October";
case 10:
return "November";
case 11:
return "December";
default:
return "January";
}
}
int DateTime::GetDate() const
{
return m_time.tm_mday;
}
int DateTime::GetYear() const
{
return 1900 + m_time.tm_year;
}
const int DateTime::GetSecondsUntilNextWeekDay(
const std::string& day_name) const
{
// Calculate how many seconds left for today...
const int todays_hours_left = 23 - m_time.tm_hour;
const int todays_minutes_left = (todays_hours_left * 60) + (59 - m_time.tm_min);
const int todays_seconds_left = (todays_minutes_left * 60) + (59 - m_time.tm_sec);
int overlap_seconds = 0;
// Calculate how many days until the desired date.
int current_day_number = m_time.tm_wday;
const int desired_day_number = GetWeekDayNumberFromName(day_name);
if (desired_day_number >= 0)
{
if (desired_day_number <= current_day_number)
{
// Find out how many days left in the week, add them to how many days until the today.
const int max_day = 6;
const int days_remaining = max_day - current_day_number;
overlap_seconds = (days_remaining * 24 * 60 * 60);
current_day_number = 0;
}
const int days_left = desired_day_number - current_day_number;
const int hours_left = days_left * 24;
const int minutes_left = hours_left * 60;
const int seconds_left = (minutes_left * 60) - (86400 - todays_seconds_left) + overlap_seconds;
return seconds_left;
}
return -1;
}
const int DateTime::GetWeekDayNumberFromName(
const std::string& name) const
{
if (name == "Sunday")
{
return 0;
}
else if (name == "Monday")
{
return 1;
}
else if (name == "Tuesday")
{
return 2;
}
else if (name == "Wednesday")
{
return 3;
}
else if (name == "Thursday")
{
return 4;
}
else if (name == "Friday")
{
return 5;
}
else if (name == "Saturday")
{
return 6;
}
return -1;
}
#include <iostream>
#include "DateTime.h"
int main()
{
DateTime date_time;
const int seconds = date_time.GetSecondsUntilNextWeekDay("Monday");
std::cout << "Seconds Till Date: " << seconds;
}
最佳答案
这个问题有两个微妙的问题:
#include "date/tz.h"
#include <chrono>
#include <iostream>
std::chrono::seconds
GetSecondsUntilNextWeekDay(date::weekday wd,
date::sys_seconds tp =
date::floor<std::chrono::seconds>(std::chrono::system_clock::now()))
{
using namespace std::chrono;
using namespace date;
auto zone = current_zone();
zoned_seconds now = {zone, tp};
auto today_local = floor<days>(now.get_local_time());
weekday today_wd{today_local};
auto delta_days = wd - today_wd;
if (delta_days == days{0} && now.get_local_time() != today_local)
delta_days += weeks{1};
zoned_seconds target_date = {zone, today_local + delta_days};
return target_date.get_sys_time() - now.get_sys_time();
}
int
main()
{
using namespace date;
using namespace std::chrono;
zoned_seconds zt{current_zone(), local_days{March/9/2019} + 22h + 2min + 5s};
std::cout << GetSecondsUntilNextWeekDay(Monday, zt.get_sys_time()) << '\n';
}
zoned_seconds
来工作。
zoned_seconds
是ozt_code的特殊化,具有秒精度。
zoned_time<Duration>
是本地时间点和
zoned_time
的配对。可以等效地将其视为UTC时间点和
time_zone
的配对。在任何一种情况下,都可以使用
time_zone
或
local_time
(
sys_time
是UTC)进行构造,并且可以提取
sys_time
和
local_time
两者,它们通过
sys_time
相关。
time_zone
与
time_zone
一起找到,它可以检测计算机的当前本地时区设置。
current_zone()
是输入
now
(
sys_time
是秒精度
sys_seconds
的别名)和计算机当前本地时区的配对。
sys_time
是一种日精度
today_local
,可通过获取
local_time
的
now
并将其下限为日精度来找到。
local_time
可以直接从
weekday
构造。
today_local
是一个必须添加到
delta_days
中才能达到
today_wd
的目标
weekday
的天数。
wd
减法本质上是循环的:它总是导致[0,6]范围内的天数,并且独立于工作日的基础编码。例如,即使星期六编码为6,星期日编码为0,星期日也总是在星期六之后1天。
weekday
与目标
weekday
相同,并且这不是目标
weekday
的第一秒,那么我们要计算到下周同一天的开始。否则,
weekday
是目标日期,此函数将返回0秒。
now
)和当前日期(
delta_days
),可以使用
today_local
计算目标日期。这是天精度的
today_local + delta_days
,它将隐式转换为秒精度,并指向一天的开始。这与本地时区配对以构造
local_time
。
target_date
和
target_date
,我们只需要减去它们就可以得到所需的秒数。有两种方法可以执行此减法:
now
中。这将以本地local_time
定义的“日历秒”来度量时间。在此日历中,所有时间均为24小时。 time_zone
中。这将在减法之前转换为UTC,从而测量“物理秒”。这将在上述情况2中检测到23h星期日。 sys_time
编码,因此大大简化了。 std::cout << GetSecondsUntilNextWeekDay(Saturday) << '\n';
128459s
weekday
中。
关于c++ - 如何在C++中计算到下一个星期六的秒数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55623461/
我有一个数据框,其日期格式为“%d-%m-%Y”,并且有周数。日期是工作日,我希望在另一栏中显示该周的星期六。 我最初使用 Chron 包中的函数检查日期是工作日还是周末,但这是一个 bool 验证。
我想以字符串“2016-01-04 22:00:00 +0000”显示“Saturday | 4.08.2016”格式的日期。我怎样才能做到这一点? iOS有内置方法吗? 最佳答案 这对我来说是日期格
这个问题在这里已经有了答案: Sorting object property by values (45 个答案) 关闭 7 年前。 如何按工作日对工作日的 Javascript 对象进行排序,即这
我正在使用 UILocalNotification 进行报警。我有一个基于工作日(星期日、星期一、星期二、星期三、星期四、星期五、星期六)重复的自定义选项。这么多应用程序都做了这个过程。我尽力了。但我
下面的函数返回图表数据 上述函数返回的输出格式如下 [Object { date=Date, value=112, volume=1469}, Object { date=Date, value
我是一名优秀的程序员,十分优秀!