1

我正在研究一个列出不同项目位置的项目,每个项目位置都与不同的时区相关联。我正在使用 FSCalendar 在其时区显示当前选定项目的日期。我无法在 FSCalendar 视图上正确显示日期。

无论设备中配置的时区如何,我都想在 FSCalendar 视图上显示日期。这意味着即使用户手动更改时区以在设备中设置,此更改也不应该影响我的项目日历。(例如:通常在所有设备中都会选择自动时区)

为此,我必须使用选定的项目时区配置 FSCalendar。

我尝试使用 DateFormatter() 将 Date() 转换为 Project 时区。尝试 DST 计算。

  func isDateInProjectTimeZone() -> Bool {
       if let projectTimeZone = AppUtils.timeZoneForProject() {
           let dateFormatter = DateFormatter()
           dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"

           var calendar = Calendar.current
           calendar.timeZone = projectTimeZone

           return calendar.isDateInToday(Date().dateInProjectTimeZone())
       }
       return false
  }
4

2 回答 2

1

我能够使用 FSCalendar 通过以下步骤实现我的要求,如果有人遇到相同的情况,答案可能会有用。

要更改 FSCalendar 时区,请按照以下步骤操作:

  • 创建一个 FSCalendar 的自定义类并编写所需的初始化方法,如下所示。

    import FSCalendar
    
    class XYZFSCalendar: FSCalendar {
    
       override init(frame: CGRect) {
          super.init(frame: frame)
       }
    
       required init?(coder aDecoder: NSCoder) {
    
           super.init(coder: aDecoder)
    
           if let projectTimeZone = <Set_Your_Time_Zone_Here> {
              self.setValue(projectTimeZone, forKey: "timeZone")
              self.perform(Selector(("invalidateDateTools")))
           }
       }
    }
    
  • 上面的代码使 FSCalendar 独立于系统时间

  • 将 Storyboard 中的上述自定义日历分配为 FSCalendar 的自定义类
  • 如果您将任何日期分配给日历

例如:

import FSCalendar

class ViewController: UIVIewController {
    @IBOutlet weak var calendar: XYZFSCalendar!

    override func viewDidLoad() {
       super.viewDidLoad()

       //When you set the date below, the date will be displayed in the FSCalendar based on your custom timezone.
       calendar.select = Date()

    }
} 

这对我的情况有所帮助,希望它也可以帮助有需要的人。timeZone 可能不会全局更改,但每次使用您为 FSCalendar 预设的 timeZone 实例化类时,它都会起作用。

谢谢你。

于 2019-11-21T09:40:21.650 回答
0

我刚刚遇到了同样的问题,并通过更新项目本身来解决它。

  1. FSCalendar.m通过从以下位置删除属性并将其添加到以下位置来公开时区FSCalendar.h
@property (copy, nonatomic) NSTimeZone *timeZone;
  1. 覆盖设置器:
- (void)setTimeZone:(NSTimeZone *)timeZone
{
    if (![_timeZone isEqual:timeZone]) {
        _timeZone = timeZone.copy;
        [self invalidateDateTools];
    }
}
于 2021-09-15T15:23:23.233 回答