Преобразование даты AppleScript в объект NSdate в ASOBJC?

Итак, у меня есть код AppleScriptObjC, который делает некоторые вещи с датами. Одна из первых вещей, которые он делает, — это преобразование сегодняшней даты в объект NSDate.

set nowDate to current application's NSDate's |date|()

Я хотел бы установить nowDate на любую дату по своему выбору. Из всего, что я читал, до 10.11 это был очень сложный процесс. Но в 10.11 якобы стало проще. Я не мог найти примеров того, как это было проще.

Чего бы я действительно хотел, так это иметь возможность сказать

    set aDate to current date
    set day of aDate to "15"
    set month of aDate to "5"
    set year of aDate to "2020"
    set hours of aDate to "13"
    set minutes of aDate to "00"
    set seconds of aDate to "00"

    set nowDate to NSDate's aDate --or something simple like that

Я также нашел эту функцию, которая, похоже, может установить дату на любую дату, которую вы хотели бы, но я не знаю, как преобразовать ее в полезный код ASOBJC (я немного возился с ней, но ничего не получил):

- (NSDate *)dateWithEra:(NSInteger)eraValue 
                   year:(NSInteger)yearValue 
                  month:(NSInteger)monthValue 
                    day:(NSInteger)dayValue 
                   hour:(NSInteger)hourValue 
                 minute:(NSInteger)minuteValue 
                 second:(NSInteger)secondValue 
             nanosecond:(NSInteger)nanosecondValue;

Бонусный вопрос... каково целочисленное значение эпохи, в которой мы живем?


person Chris Norman    schedule 10.04.2020    source источник


Ответы (2)


Хотя AppleScriptObjC легко преобразует NSDate в дату AppleScript, нет ничего проще, чем пойти другим путем.

Есть кое-что довольно простое: дата AppleScript неявно связывается с NSDate при использовании в качестве параметра, поэтому вы можете легко преобразовать ее с помощью

use AppleScript version "2.5"
use framework "Foundation"
use scripting additions

set currentDate to current date
set cocoaDate to current application's NSDate's dateWithTimeInterval:0 sinceDate:currentDate
log cocoaDate
person vadian    schedule 10.04.2020
comment
Поэтому, когда я пытаюсь запустить ваш код, он по какой-то причине превращает NSDate в переменную nsDate. Я предполагаю, что нам где-то не хватает кода. Сначала я добавил use framework "Foundation" в код. - person Chris Norman; 10.04.2020
comment
упс, это я тоже пропустил. @vadian Я имел в виду возможность использовать принуждение, такое как методы someNSDate as date vs NSDate. - person red_menace; 10.04.2020
comment
@red_menace Тип с неявным мостом на самом деле является принуждением ???? - person vadian; 10.04.2020
comment
Для этого потребуется либо use scripting additions, либо using terms from scripting additions где-то перед строкой set currentDate to current date - person CJK; 11.04.2020

Хотя AppleScriptObjC легко принудит NSDate к дате AppleScript, нет ничего настолько простого, чтобы пойти другим путем. В Cocoa есть множество вариантов дат, поэтому вам нужно будет использовать несколько операторов, чтобы определить, что вы хотите.

Преобразование для вашего метода Objective-C будет примерно таким (не забывайте о каналах вокруг терминов AppleScript):

use framework "Foundation"
use scripting additions

tell (current date) to set {theDay, theMonth, theYear, theHours, theMinutes, theSeconds} to {its day, its month as integer, its year, its hours, its minutes, its seconds}

set theCalendar to current application's NSCalendar's currentCalendar
theCalendar's dateWithEra:1 |year|:theYear |month|:theMonth |day|:theDay hour:theHours minute:theMinutes |second|:theSeconds nanosecond:0

Вы также можете использовать NSDateFormatter для преобразования строки даты в формате ISO:

tell ((current date) as «class isot» as string) to set dateString to it

set formatter to current application's NSDateFormatter's alloc's init
formatter's setDateFormat:"yyyy-MM-dd'T'HH:mm:ss"
# formatter's setLocale:(current application's NSLocale's alloc's initWithLocaleIdentifier:"en_US_POSIX")
formatter's dateFromString:dateString

Что касается вашего бонусного вопроса, это зависит от используемого календаря, но для григорианского календаря есть две эпохи: BCE/BC и CE/AD. Из Руководство по дате и времени, если вы используете отрицательные годы для BCE, эра будет равна 0, иначе будет 1.

person red_menace    schedule 10.04.2020