I am working on NSDate and i am new for it.I have start date and end date,getting from user.And it is 2013-01-01 and 2013-02-19.When i try to display in console it is showing me 2012-12-31 18:30:00 +0000.So you can say 5:30 is gap.So i am adding time interval
startDate = [aStartdDate dateByAddingTimeInterval:19800];
endDate = [aEndDate dateByAddingTimeInterval:19800];
My question is when i am trying to get current week using 2012-12-31 18:30:00 +0000 date, it is showing me correctly.But when i use 2013-02-01 00:00:00 +0000 date,it is showing me total number of weeks in month.Please help me.Thanking you.
Timezones shouldn't be part of your model - They are a presentation problem.
Your model should always use a common default timezone. If you present the date to your users, apply a NSDateFormatter that uses a specific timezone.
In your case this means, that you shouldn't try to fix your dates by applying arbitrary intervals but use a date formatter in the final step (output) instead.
Related
Hi there in my app I need to filter some documents through date. I need to see if the first date is the same day of the second date, so I searched on Apple Documentation to see if there are a solution to do this without create a method and I found this instruction isDate(_:inSameDayAs:), but if i try to compare the following date:
2020-07-29 16:15:50 +0000
2020-07-29 22:00:00 +0000
As you can see the day is the same, but I'm not able to understand why it return false, what's wrong?
CODE
Here's my code to check the difference between days:
myArray.filter({Calendar.current.isDate($0.log.createdDate, inSameDayAs:date)})
Date represents instants in time. Two instants of time could be in the same day in one timezone, but not in the same day in another timezone. These two instants in time:
2020-07-29 16:15:50 +0000
2020-07-29 22:00:00 +0000
are in the same day in the UTC timezone. However, in a timezone where the offset is 5 hours ahead of UTC (UTC+5) for example, the two times will not be in the same day, because they will become:
2020-07-29 21:15:50
2020-07-30 03:00:00
in that timezone
Now you should see that the timezone is crucial at determining whether two dates are in the same day.
Calendar.current uses the local timezone of the device for almost everything it does. isDate(_:inSameDayAs:) is no exception. In your device's timezone, the two dates are not in the same day. However, when you print them out without a formatter, they are always printed in the UTC timezone. In the UTC timezone, they are in the same day, making you think Calendar.current is wrong. Assuming you actually want to see if the two dates are in the same day in your device's timezone, then Calendar.current is right, and you don't need to fix anything.
To print the two dates in your timezone, use a formatter:
let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .long
print(formatter.string(from: yourDate))
If you actually want to see if the two dates are in the same UTC day, then you can set the timezone of the Calendar:
var calendar = Calendar.current
calendar.timeZone = TimeZone(identifier: "UTC")!
// call calendar.isDate(_:_sameDayAs:) rather than using Calendar.current
Allover the app I use Date objects that when I NSLog the value it shows me:
2020-05-24 22:00:00 +0000
Which I think locally means the 25th (- 1 for summer, -1 for timezone). I want to do some Calendar date comparisons:
var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = TimeZone(identifier: "UTC")!
// In order to have start on Monday
calendar.firstWeekday = 2
Using this calendar, lets say I want to get the starting date of current week:
extension Date
{
var startOfWeek: Date {
return Calendar.gregorian.date(from: Calendar.gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
}
}
If I NSLog:
Date().startOfWeek
It will show me:
2020-05-25 00:00:00 +0000
If I disable the timeZone line on Calendar, it shows me:
2020-05-24 22:00:00 +0000
I always thought the second one is the correct UTC version. Am I wrong? Because I thought all core data dates, all dates are in the 2nd version. In short: If I set Calendar to UTC, my date comparissons are wrong. If I don't they are good. And all this time dates are in UTC.
You are wrong because CoreData dates are not affected by TimeZone. Dates are dates. Think of them as numeric values. When you translate that value to a date and hour then, and only then, the TimeZone is applied.
In your example everything is correct. For a calendar whose TimeZone is UTC, 2020-05-25 00:00:00 +0000 is the beginning of the week. If you use other TimeZone values (for example the default value from Locale) then the your week start at 2020-05-24 22:00:00 +0000. That means that in your TimeZone the hour is 2020-05-25 00:00:00.
I have this date in actuall
2016-09-03 19:00:00 +0000
Now I am trying to convert it to String using a specific format like below
But what I am getting in return is not as desired. the formatter is adding on day to the given date like below
Is this standard behaviour ?
This is not standard behaviour. This happen because of the time zone difference. Set time zone proper
Set the timezone.
formatter.timeZone = [NSTimeZone timeZoneWithAbbreviation: #"GMT"];
When you hover over the date, you can see that it is showing UTC, whereas the formatter is automatically converting this to a local date. If your timezone is 5 hours ahead of UTC, then it will be the next day locally from that time.
I know that NSDate doesn't have timezone information.
However, I'm trying to understand how to manipulate them properly.
At the moment I'm passing a date into an object. That date is the user selected date at time 00:00:00.
i.e. if the user hits October 21st then the NSDate passed in should be. 21/10/2013 00:00:00.
However, it isn't it's 20/10/2013 23:00:00. (One hour before).
Now, this is nothing about formatting them or displaying them. I'm just using the NSDates.
I'm creating the date using NSDateComponents and NSCalendar.
I guess my question is...
How can I tell what date an NSDate is actually referring to in my local time zone?
I need to send a UNIX time stamp for 00:00:00 and 23:59:59 for a given date. However, at the moment when I set the hour, minute and second to 0, 0 and 0 then I'm not getting midnight in the current time zone I'm getting midnight in GMT.
This isn't what I want.
Fixed?
OK, I've fixed it... I think. At least, it's doing what I want it to do.
The trick is...
NSTimeZone *timeZone = [NSTimeZone localTimeZone];
[dateComponents setSecond:timeZone.secondsFromGMT];
I've been confused by this many times. When you NSLog an NSDate, you'll always get the output in GMT. So the 20/10/2013 23:00:00 (GMT) you're seeing is the same as your expected 21/10/2013 00:00:00 (BST). The UNIX timestamp for both of these dates would be the same because it doesn't take into account timezone - it's always UTC.
If you want to output in a user-readable format, an NSDateFormatter will format the date using your current timezone and locale.
I am trying to convert milliseconds into date. Below shown is the code i am using.
double startDateDb=1380275880000;
NSDate *date=[NSDate dateWithTimeIntervalSince1970:(startDateDb/1000.0)];
NSLog(#"date---%#",date);
My log gives date as 2013-09-27 09:58:00 +0000
When i use online tool to convert i am getting "9/27/13 5:58 AM" which is correct.
Please help me to fix the issue.
NSLog used your timezone when displaying dates. TO get the date in UTC use the NSDate methods and specify the tie zone. All NSDates are UTC timezone based.
Use NSDateFormatter to display the date/time in another timezone.
Your NSLog put the timezone in GMT, the timezone you're looking for is GMT-4.