当前位置: 首页 > 面试题库 >

如何快速检查时间是否在特定范围内

商宏爽
2023-03-14
问题内容

嗨,我正在尝试检查当前时间是否在某个时间范围内,例如8:00-16:30。下面的代码显示可以将当前时间作为字符串获取,但是不确定如何使用此值来检查它是否在上面指定的时间范围内。任何帮助将不胜感激!

var todaysDate:NSDate = NSDate()
var dateFormatter:NSDateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "HH:mm"
var dateInFormat:String = dateFormatter.stringFromDate(todaysDate)
println(dateInFormat) // 23:54

问题答案:

有很多方法可以做到这一点。就我个人而言,如果可以避免的话,我不喜欢使用字符串。我宁愿处理日期组件。

下面的代码创建的日期为8:00和16:30,然后比较日期以查看当前日期/时间是否在该范围内。

它比其他人的代码长,但是我认为值得学习如何使用Calendar进行日期计算:

编辑#3:

这个答案来自很久以前。我将在下面保留旧答案,但这是当前解决方案:

@CodenameDuchess的答案使用系统功能,
date(bySettingHour:minute:second:of:matchingPolicy:repeatedTimePolicy:direction:)

使用该函数,代码可以简化为:

import UIKit

// The function `Calendar.date(bySettingHour:minute:second)` lets you 
// create date objects for a given time in the same day of given date
// For example, 8:00 today

let calendar = Calendar.current
let now = Date()
let eight_today = calendar.date(
  bySettingHour: 8,
  minute: 0,
  second: 0,
  of: now)!

let four_thirty_today = calendar.date(
  bySettingHour: 16,
  minute: 30,
  second: 0,
  of: now)!

// In recent versions of Swift Date objectst are comparable, so you can 
// do greater than, less than, or equal to comparisons on dates without
// needing a date extension

if now >= eight_today &&
  now <= four_thirty_today
{
  print("The time is between 8:00 and 16:30")
}

为了历史的完整性,下面是旧的(Swift 2)答案:

此代码使用Calendar对象获取当前日期的日/月/年,并添加所需的小时/分钟组成部分,然后为这些组成部分生成日期。

import UIKit
//-------------------------------------------------------------
//NSDate extensions.
extension NSDate
{
  /**
  This adds a new method dateAt to NSDate.

  It returns a new date at the specified hours and minutes of the receiver

  :param: hours: The hours value
  :param: minutes: The new minutes

  :returns: a new NSDate with the same year/month/day as the receiver, but with the specified hours/minutes values
  */
  func dateAt(#hours: Int, minutes: Int) -> NSDate
  {
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!

    //get the month/day/year componentsfor today's date.

    println("Now = \(self)")

    let date_components = calendar.components(
      NSCalendarUnit.CalendarUnitYear |
        NSCalendarUnit.CalendarUnitMonth |
        NSCalendarUnit.CalendarUnitDay,
      fromDate: self)

    //Create an NSDate for 8:00 AM today.
    date_components.hour = hours
    date_components.minute = minutes
    date_components.second = 0

    let newDate = calendar.dateFromComponents(date_components)!
        return newDate
  }
}
//-------------------------------------------------------------
//Tell the system that NSDates can be compared with ==, >, >=, <, and <= operators
extension NSDate: Equatable {}
extension NSDate: Comparable {}

//-------------------------------------------------------------
//Define the global operators for the 
//Equatable and Comparable protocols for comparing NSDates

public func ==(lhs: NSDate, rhs: NSDate) -> Bool
{
  return lhs.timeIntervalSince1970 == rhs.timeIntervalSince1970
}

public func <(lhs: NSDate, rhs: NSDate) -> Bool
{
  return lhs.timeIntervalSince1970 < rhs.timeIntervalSince1970
}
public func >(lhs: NSDate, rhs: NSDate) -> Bool
{
  return lhs.timeIntervalSince1970 > rhs.timeIntervalSince1970
}
public func <=(lhs: NSDate, rhs: NSDate) -> Bool
{
  return lhs.timeIntervalSince1970 <= rhs.timeIntervalSince1970
}
public func >=(lhs: NSDate, rhs: NSDate) -> Bool
{
  return lhs.timeIntervalSince1970 >= rhs.timeIntervalSince1970
}
//-------------------------------------------------------------

let now = NSDate()
let eight_today = now.dateAt(hours: 8, minutes: 0)
let four_thirty_today = now.dateAt(hours:16, minutes: 30)

if now >= eight_today &&
  now <= four_thirty_today
{
  println("The time is between 8:00 and 16:30")
}

编辑:

此答案中的代码已更改Swift 3的很多。

而不是使用的NSDate,它更有意义,我们本地Date的对象,Date对象EquatableComparable“开箱即用”。

因此,我们可以摆脱的EquatableComparable扩展以及定义<>=运营商。

然后,我们需要对dateAt函数中的语法进行大量调整以遵循Swift 3语法。新的扩展在Swift 3中如下所示:

Swift 3版本:

import Foundation

extension Date
{

  func dateAt(hours: Int, minutes: Int) -> Date
  {
    let calendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!

    //get the month/day/year componentsfor today's date.


    var date_components = calendar.components(
      [NSCalendar.Unit.year,
       NSCalendar.Unit.month,
       NSCalendar.Unit.day],
      from: self)

    //Create an NSDate for the specified time today.
    date_components.hour = hours
    date_components.minute = minutes
    date_components.second = 0

    let newDate = calendar.date(from: date_components)!
    return newDate
  }
}


let now = Date()
let eight_today = now.dateAt(hours: 8, minutes: 0)
let four_thirty_today = now.dateAt(hours: 16, minutes: 30)

if now >= eight_today &&
  now <= four_thirty_today
{
  print("The time is between 8:00 and 16:30")
}


 类似资料:
  • 问题内容: 我需要检查当前时间是否在8 AM和3 PM之间。如果在这些时间范围之间,那么我需要返回yes,否则返回false。 但是我不确定我应该在这里使用吗?我可以不使用时间戳并相应地检查时间戳吗?什么是正确的方法? 我仍在使用Java 7。 问题答案: 如果您使用的是Java 8之前的Java版本,请查看Joda的API文档。 具体来说,有一个AbstractInterval#contains

  • 问题内容: 如果有和,如何检查用户给出的日期是否在该范围内? 例如 目前日期是字符串,将它们转换为时间戳整数是否有帮助? 问题答案: 使用strtotime将它们转换为时间戳是正确的方法,例如

  • 问题内容: 有没有一种方法可以在不执行此冗余代码的情况下测试范围: ? 就像一个函数: 用法: ? PHP是否具有这种内置功能?还是其他方式可以做到? 问题答案: 我认为您不会获得比您的功能更好的方法。 它是干净的,易于遵循和理解的,并返回条件的结果(无混乱)。

  • 问题内容: 我有一系列包含开始日期和结束日期的范围。我想检查日期是否在该范围内。 和似乎有点尴尬。我真正需要的是这样的伪代码: 不确定是否相关,但是我从数据库中提取的日期带有时间戳。 问题答案: 对我来说似乎并不尴尬。请注意,我是这样写的,而不是 因此,即使testDate与以下几种情况之一完全相同,它也可以正常工作。

  • 问题内容: 我确信这在1000个不同的地方完成了1000次。问题是我想知道是否有更好/标准/更快的方法来检查当前“时间”是否在格式指定的两个时间值之间。例如,我的大业务逻辑不应在之间运行。所以这就是我的想法: 示例测试用例: 我正在寻找的是更好的代码 在表现 在外观上 正确地 我不想要的 第三方库 异常处理辩论 变量命名约定 方法修饰符问题 问题答案: 这就是您需要做的所有事情,此方法与输入松散耦

  • 我的Java外汇应用程序处理工作时间。我在两个日期字段中有工作开始和结束时间。我成功地计算了两个日期之间的差异时间;但是现在我如何检查结果是在晚上还是白天的范围内???一天从6点开始,到22点结束。例如,有人在凌晨3点到晚上11点之间工作。下面是我如何计算总工作小时数的。 我们有可以工作到晚上10点以上的工人,工资也不一样。如果他们在晚上10点以后工作,他们将获得特殊报酬。我们在工作结束时付款。他