Ok, as promised, here is a code sample that covers the major concepts in this thread that has made working with dates, and converting them back and forth to AS values as required, really quite easy in ASOC, thanks to Craig and Shane’s help above.
In the sample code all that is needed in IB is for a Date Picker(NSDatepicker) control to be placed in the window and connected (control-drag) to the app delegate class, selecting the DoWithTheDate_(sender) as the IB Action. Also connect FROM app delegate back to the datepicker selecting as the IB Outlet" datePicker " You’re done, then build and run. I suggest you follow along in the code as the dialog’s present the variations on the date you selected to, prevent “death by dialog”, or you can replace the Dislay Dialog command with log, and view the results in the Run Menu> Console.
I have also commented the code where appropriate. Note that there are no date comparision method, but they should be easy to cobble together with the key code from the above posts as well as from the code snippets in this sample.
Once again, thanks all for the help on this thread.
All the best
Jim
script TestAppDelegate
property parent : class "NSObject"
property datePicker : missing value
property theDate : ""
property theCal : ""
property theComponents : ""
property dateFormatter : ""
property theString : ""
on DoWithTheDate_(sender)
--PART 1 - Changing the seconds in a date instance to zero
-- set theDate property after user makes selection from the picker
set theDate to my datePicker's dateValue()
--set theCal var to a new(empty) instance of the calendar
set theCal to current application's class "NSCalendar"'s currentCalendar()
-- unpack the components of theDate to a variable
set theComponents to theCal's components_fromDate_(254, theDate)
-- Don't bother with seconds so set them to :00 (top of the clock)
-- this will allow the user to pick a time to the minute
-- for a task and prevent the task from firing at anytime
-- but on the top of the minute
theComponents's setSecond_(0)
-- reset theDate variable with the with new seconds we set above
-- by rolling the components back up into a new NSDate
set my theDate to theCal's dateFromComponents_(theComponents)
-- Finally adjust the datePicker to the new value
-- you should adjust the datepicker's attributes in IB to not show the seconds
my datePicker's setDateValue_(theDate) --
-- this dialog shows the resut from above with the seconds set to :00
display dialog ("Part one - Result of changing seconds to :00 - Date is shown in International format
" & my datePicker's dateValue()'s |description| as string)
-- END OF PART 1
--PART 2 - Converting the NSDate to an AS date and working with it
-- Set new variables with values unpacked from theComponents
-- variable we worked with above and use them
-- to make a new AS date
set theYear to theComponents's |year|()
set theMonth to theComponents's |month|()
set theDay to theComponents's |day|()
set theHour to theComponents's hour()
set theMinute to theComponents's minute()
set theSecond to theComponents's |second|()
-- instantiate a new AS date to work with
set theDate to current date
display dialog ("PART 2 - Dialog 1 - This is the new AS date instance before revision
" & theDate as string)
display dialog ("Part 2 - Dialog 2 - This is the AS Date's time string " & time string of (theDate))
-- now revise theDate with our variables from above
set day of theDate to 1 -- important
set seconds of theDate to theSecond
set year of theDate to theYear
set month of theDate to theMonth
set day of theDate to theDay
set hours of theDate to theHour
set minutes of theDate to theMinute
display dialog ("PART 2 - Dialog 3 - This is the new AS date with Datepickers components and seconds revised from above " & theDate as string)
display dialog (("PART 2 - Dialog 4 - This is the value for the seconds from midnight for processing in AS if desired " & theDate's time) as string)
--END OF PART 2
-- PART 3 - Using a formatter to get a string value directly from an NSDate
-- first set up a new variable
set theString to theDate
-- put a fresh NSDate instance from the datePicker into theDate replacing the AS date from PART 2
set theDate to my datePicker's dateValue()
-- Instantiate a dateFormatter. Note there is no formatter required in IB in the datepicker
-- as we are creating it in the code
set dateFormatter to current application's class "NSDateFormatter"'s alloc()'s init()
-- set the dateformatter's attributes. Play with them to change the
-- values in the dialog.
dateFormatter's setDateStyle_(3) -- 0 = none, 1 = short, 2 = med, 3 = long, 4 = full
dateFormatter's setTimeStyle_(4) -- 0 = none, 1 = short, 2 = med, 3 = long, 4 = full
-- use the dateFormatter's get method to get a string from theDate
set theString to dateFormatter's stringFromDate_(theDate)
display dialog ("PART 3 - a nicely formatted date string for presentation to the user -
" & theString as string)
end DoWithTheDate_
on applicationWillFinishLaunching_(aNotification)
-- set the datePicker to now so the user doesn't see a strange date in the picker
set theDate to current application's class "NSDate"'s |date|()
--initialize the date property we will be working with
my datePicker's setDateValue_(theDate)
-- Insert code here to initialize your application before any files are opened
end applicationWillFinishLaunching_
on applicationShouldTerminate_(sender)
-- Insert code here to do any housekeeping before your application quits
return true
end applicationShouldTerminate_
end script