Преобразование даты AppleScript в объект NSdate в ASOBJ C? - PullRequest
0 голосов
/ 10 апреля 2020

Итак, у меня есть код AppleScriptObj C, который делает некоторые вещи с датами. Первое, что он делает, это конвертирует сегодняшнюю дату в объект 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

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

- (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;

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

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Хотя AppleScriptObj C легко преобразует 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
1 голос
/ 10 апреля 2020

Хотя AppleScriptObj C будет легко приводить 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 / B C и CE / AD. Из Apple Date and Time Guide , если вы используете отрицательные годы для BCE, эра будет 0, в противном случае это будет 1.

...