Archive for the 'NSTimeZone' Category

2017/06/21 日の出、日没時刻を計算するv2

オープンソースのプロジェクト「EDSunriseSet」(By Ernesto García)をFramework化した「EDSunriseSet.framework」を呼び出して日の出、日没時刻を計算するAppleScriptのアップデート版です。

本AppleScriptのテストのためには、EDSunriseSet.frameworkを~/Library/Frameworksフォルダに入れておく必要があります。バイナリを用意しておきましたので、自己責任でおためしください。

→ Download Binary (26KB)

EDSunriseSetが用意している各種の日の出、日没情報を取得するようにしてみました。

日没や日の出前後の「薄明」の情報についても取得します。

1024px-twilight_subcategoriessvg_resized.png

ただ、白夜などの現象が発生しない地域でこれらの薄明の情報はとくに必要はないように感じます(個人の見解です)。

AppleScript名:日の出、日没時刻を計算するv2
– Created 2017-06-19 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “EDSunriseSet” –erndev/EDSunriseSet
–https://github.com/erndev/EDSunriseSet
–http://piyocast.com/as/archives/4699

set cityRecList to {{kCityName:“Tokyo”, kCityLatitude:(35.6894875), kCityLongitude:(139.6917064), kCityTimeZone:“Asia/Tokyo”}}

set dList to {}

repeat with i in cityRecList
  set the end of dList to getSunriseSunset(i) of me
end repeat
return dList
–>  {{sunrise:date “2017年6月21日水曜日 4:25:37″, sunset:date “2017年6月21日水曜日 19:00:21″, civilTwilightStart:date “2017年6月21日水曜日 3:55:35″, civilTwilightEnd:date “2017年6月21日水曜日 19:30:23″, nauticalTwilightStart:date “2017年6月21日水曜日 3:18:15″, nauticalTwilightEnd:date “2017年6月21日水曜日 20:07:44″, astronomicalTwilightStart:date “2017年6月21日水曜日 2:36:45″, astronomicalTwilightEnd:date “2017年6月21日水曜日 20:49:13″, cityname:”Tokyo”}}

on getSunriseSunset(cityRec)
  set curLocale to current application’s NSLocale’s currentLocale()
  
set curDate to current application’s NSDate’s |date|()
  
  
set aTZ to current application’s NSTimeZone’s alloc()’s initWithName:(kCityName of cityRec)
  
set aSunrizeSunset to current application’s EDSunriseSet’s alloc()’s initWithDate:curDate timezone:aTZ latitude:(kCityLatitude of cityRec) longitude:(kCityLongitude of cityRec)
  
  
–日の出、日没  
  
set aSunRiseDate to (aSunrizeSunset’s sunrise) as date
  
set aSunSetDate to (aSunrizeSunset’s sunset) as date
  
  
–https://en.wikipedia.org/wiki/Twilight
  
–https://ja.wikipedia.org/wiki/薄明
  
  
–市民薄明(常用薄明、第三薄明)
  
set aCivilTwilightStart to (aSunrizeSunset’s civilTwilightStart) as date
  
set aCivilTwilightEnd to (aSunrizeSunset’s civilTwilightEnd) as date
  
  
–航海薄明(第二薄明)
  
set aNauticalTwilightStart to (aSunrizeSunset’s nauticalTwilightStart) as date
  
set aNauticalTwilightEnd to (aSunrizeSunset’s nauticalTwilightEnd) as date
  
  
–天文薄明(第一薄明)
  
set anAstronomicalTwilightStart to (aSunrizeSunset’s astronomicalTwilightStart) as date
  
set anAstronomicalTwilightEnd to (aSunrizeSunset’s astronomicalTwilightEnd) as date
  
  
return {sunrise:aSunRiseDate, sunset:aSunSetDate, civilTwilightStart:aCivilTwilightStart, civilTwilightEnd:aCivilTwilightEnd, nauticalTwilightStart:aNauticalTwilightStart, nauticalTwilightEnd:aNauticalTwilightEnd, astronomicalTwilightStart:anAstronomicalTwilightStart, astronomicalTwilightEnd:anAstronomicalTwilightEnd, cityname:kCityName of cityRec}
end getSunriseSunset

★Click Here to Open This Script 

2017/06/19 日の出、日没時刻を計算する

オープンソースのプロジェクト「EDSunriseSet」(By Ernesto García)をFramework化した「EDSunriseSet.framework」を呼び出して日の出、日没時刻を計算するAppleScriptです。

edsunriseset.png
▲もともとのGUI版サンプルプログラム

本AppleScriptのテストのためには、EDSunriseSet.frameworkを~/Library/Frameworksフォルダに入れておく必要があります。バイナリを用意しておきましたので、自己責任でおためしください。

→ Download Binary (26KB)

本Scriptは単にEDSunriseSetのサンプル中に書かれていたサンプルデータをそのまま利用したものであり、本来であればCoreLocationを呼び出して現在位置を取得し、システム設定からタイムゾーン情報を取得し位置情報から逆住所ジオコーダーで場所の住所情報を取得するといった処理になることでしょう。もちろん、任意の年月日の日付オブジェクトを作って指定するとか。

AppleScript名:日の出、日没時刻を計算する
– Created 2017-06-19 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “EDSunriseSet” –erndev/EDSunriseSet
–https://github.com/erndev/EDSunriseSet
–http://piyocast.com/as/archives/4696

set cityRecList to {{kCityName:“Madrid”, kCityLatitude:(40.4165), kCityLongitude:(-3.70256), kCityTimeZone:“Europe/Madrid”}, {kCityName:“Beijing”, kCityLatitude:(39.9075), kCityLongitude:(116.39723), kCityTimeZone:“Asia/Shanghai”}, {kCityName:“Cupertino”, kCityLatitude:(37.3229978), kCityLongitude:(-122.0321823), kCityTimeZone:“America/Los_Angeles”}, {kCityName:“New York”, kCityLatitude:(40.7127837), kCityLongitude:(-74.0059413), kCityTimeZone:“America/New_York”}, {kCityName:“Tokyo”, kCityLatitude:(35.6894875), kCityLongitude:(139.6917064), kCityTimeZone:“Asia/Tokyo”}, {kCityName:“Sydney”, kCityLatitude:(-33.8674869), kCityLongitude:(151.2069902), kCityTimeZone:“Australia/Sydney”}}

set dList to {}

repeat with i in cityRecList
  set the end of dList to getSunriseSunset(i) of me
end repeat
return dList
–>  {{sunrise:date “2017年6月19日月曜日 13:44:22″, sunset:date “2017年6月20日火曜日 4:48:04″, cityname:”Madrid”}, {sunrise:date “2017年6月19日月曜日 5:45:35″, sunset:date “2017年6月19日月曜日 20:45:54″, cityname:”Beijing”}, {sunrise:date “2017年6月19日月曜日 21:47:30″, sunset:date “2017年6月20日火曜日 12:31:43″, cityname:”Cupertino”}, {sunrise:date “2017年6月19日月曜日 18:24:37″, sunset:date “2017年6月20日火曜日 9:30:19″, cityname:”New York”}, {sunrise:date “2017年6月19日月曜日 4:25:14″, sunset:date “2017年6月19日月曜日 18:59:52″, cityname:”Tokyo”}, {sunrise:date “2017年6月19日月曜日 5:59:28″, sunset:date “2017年6月19日月曜日 15:53:30″, cityname:”Sydney”}}

on getSunriseSunset(cityRec)
  set curLocale to current application’s NSLocale’s currentLocale()
  
set curDate to current application’s NSDate’s |date|()
  
  
set aTZ to current application’s NSTimeZone’s alloc()’s initWithName:(kCityName of cityRec)
  
set aSunrizeSunset to current application’s EDSunriseSet’s alloc()’s initWithDate:curDate timezone:aTZ latitude:(kCityLatitude of cityRec) longitude:(kCityLongitude of cityRec)
  
  
set aSunRiseDate to (aSunrizeSunset’s sunrise) as date
  
–>  date “2017年6月19日月曜日 4:25:14″
  
  
set aSunSetDate to (aSunrizeSunset’s sunset) as date
  
–>  date “2017年6月19日月曜日 18:59:52″
  
  
return {sunrise:aSunRiseDate, sunset:aSunSetDate, cityname:kCityName of cityRec}
end getSunriseSunset

★Click Here to Open This Script 

2016/04/13 ISO8601日付文字列を生成

NSDateからISO8601日付文字列を生成するAppleScriptです。

昨日のGHKitによるISO8601日付文字列ではいまひとつDropbox側と仕様が合わず、ちょっと困ってしまいました。

いくつものXcode Projectをgithub上で探してビルドしては捨て、捨ててはビルドしての繰り返しをしていました。ソースが古いとARC対応していなかったりして、かなり書き換える必要が生じてしまいます。

が、そもそも別にそんなたいしたものでもないので(^ー^;; 「自分で書いた方が簡単なんじゃないの?」と気付き、さらっと書きました。

これで、REST API経由でAppleScriptからDropboxを小突きまわして、ファイル共有期限の日時指定を行えます。

AppleScript名:ISO8601日付文字列を生成
– Created 2016-04-13 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use BridgePlust : script “BridgePlus” –for OS X 10.10.x

set aDate to (current date) + 3 * days
set bDate to Cocoaify aDate
set bStr to retISO8601DateTimeString(aDate) as string
–> “2016-04-16T09:23:11Z”

–NSDate -> ISO8601 Date & Time String for Dropbox
on retISO8601DateTimeString(targDate)
  set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init()
  
theNSDateFormatter’s setDateFormat:“yyyy-MM-dd’T’HH:mm:ss’Z’”
  
theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s alloc()’s initWithName:“UTC”)
  
return (theNSDateFormatter’s stringFromDate:targDate) as text
end retISO8601DateTimeString

★Click Here to Open This Script 

2015/08/27 NSTimeZoneのじっけん

NSTimeZoneについてのひととおりの(タイムゾーンの変更以外)メソッドを呼び出してテストしてみました。

AppleScript名:NSTimeZoneの実験
– Created 2015-08-27 by Takaaki Naganoya
– Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set aTZ to current application’s NSTimeZone’s localTimeZone()
–>  (__NSLocalTimeZone) Local Time Zone (Asia/Tokyo (JST) offset 32400)

set aTZstr to aTZ’s |name|()
–>  (NSString) “Asia/Tokyo”

set aSecFromGMT to aTZ’s secondsFromGMT()
–>  32400

set a1Str to aTZ’s abbreviation()
–>  (NSString) “JST”

set a2Str to aTZ’s |description|()
–>  (NSString) “Local Time Zone (Asia/Tokyo (JST) offset 32400)”

set a3F to aTZ’s isDaylightSavingTime()
–>  false

set a4Num to aTZ’s daylightSavingTimeOffset()
–>  0.0

set a5Num to aTZ’s nextDaylightSavingTimeTransition()
–>  missing value

set bTZ to current application’s NSTimeZone’s systemTimeZone()
–>  (__NSTimeZone) Asia/Tokyo (JST) offset 32400

set cTZ to current application’s NSTimeZone’s timeZoneWithAbbreviation:“JST”
–>  (__NSTimeZone) Asia/Tokyo (JST) offset 32400

set dTZ to current application’s NSTimeZone’s timeZoneWithName:“Asia/Tokyo”
–>  (__NSTimeZone) Asia/Tokyo (JST) offset 32400

set aDat to current application’s NSTimeZone’s defaultTimeZone()’s |data|()
–>  (NSData) <545a6966 00000000 00000000 00000000 00000000 00000003 00000003 00000000 00000009 00000003 0000000d c3553b70 d73e1e90 d7ec1680 d8f91690 d9cbf880 db071d10 dbabda80 dce6ff10 dd8bbc80 02010201 02010201 0200007e 90000000 008ca001 0500007e 9000094a 43535400 4a445400 4a535400 00000000 0000>
set eTZ to (current application’s NSTimeZone’s timeZoneWithName:“Japan” |data|:aDat)’s |description|()
–>  (NSString) “Japan (JST) offset 32400″

set fTZ to current application’s NSTimeZone’s timeZoneForSecondsFromGMT:32400
–>  (__NSTimeZone) GMT+0900 (GMT+9) offset 32400

set gTZ to current application’s NSTimeZone’s alloc()’s initWithName:“JST”
–>  (__NSTimeZone) JST (JST) offset 32400

set hTZ to current application’s NSTimeZone’s alloc()’s initWithName:“JST” |data|:aDat
–>  (__NSTimeZone) JST (JST) offset 32400

set aVerStr to current application’s NSTimeZone’s timeZoneDataVersion()
–>  (NSString) “2015f”

set iTZ to current application’s NSTimeZone’s localTimeZone()
–>  (__NSLocalTimeZone) Local Time Zone (Asia/Tokyo (JST) offset 32400)

set jTZ to current application’s NSTimeZone’s defaultTimeZone()
–>  (__NSTimeZone) Asia/Tokyo (JST) offset 32400

set kTZ to current application’s NSTimeZone’s systemTimeZone()
–>  (__NSTimeZone) Asia/Tokyo (JST) offset 32400

set aDic to current application’s NSTimeZone’s abbreviationDictionary()
–>  (NSDictionary) {​​​​​EDT:”America/New_York”, ​​​​​GMT:”GMT”, ​​​​​AST:”America/Halifax”, ​​​​​IRST:”Asia/Tehran”, ​​​​​ICT:”Asia/Bangkok”, ​​​​​PET:”America/Lima”, ​​​​​KST:”Asia/Seoul”, ​​​​​PST:”America/Los_Angeles”, ​​​​​CDT:”America/Chicago”, ​​​​​EEST:”Europe/Istanbul”, ​​​​​NZDT:”Pacific/Auckland”, ​​​​​WEST:”Europe/Lisbon”, ​​​​​EAT:”Africa/Addis_Ababa”, ​​​​​HKT:”Asia/Hong_Kong”, ​​​​​IST:”Asia/Calcutta”, ​​​​​MDT:”America/Denver”, ​​​​​NZST:”Pacific/Auckland”, ​​​​​WIT:”Asia/Jakarta”, ​​​​​ADT:”America/Halifax”, ​​​​​BST:”Europe/London”, ​​​​​ART:”America/Argentina/Buenos_Aires”, ​​​​​CAT:”Africa/Harare”, ​​​​​GST:”Asia/Dubai”, ​​​​​PDT:”America/Los_Angeles”, ​​​​​SGT:”Asia/Singapore”, ​​​​​COT:”America/Bogota”, ​​​​​PKT:”Asia/Karachi”, ​​​​​EET:”Europe/Istanbul”, ​​​​​UTC:”UTC”, ​​​​​WAT:”Africa/Lagos”, ​​​​​EST:”America/New_York”, ​​​​​JST:”Asia/Tokyo”, ​​​​​CLST:”America/Santiago”, ​​​​​CET:”Europe/Paris”, ​​​​​BDT:”Asia/Dhaka”, ​​​​​MSK:”Europe/Moscow”, ​​​​​AKDT:”America/Juneau”, ​​​​​CLT:”America/Santiago”, ​​​​​AKST:”America/Juneau”, ​​​​​BRST:”America/Sao_Paulo”, ​​​​​BRT:”America/Sao_Paulo”, ​​​​​CEST:”Europe/Paris”, ​​​​​CST:”America/Chicago”, ​​​​​HST:”Pacific/Honolulu”, ​​​​​MSD:”Europe/Moscow”, ​​​​​MST:”America/Denver”, ​​​​​PHT:”Asia/Manila”, ​​​​​WET:”Europe/Lisbon”​​​}

set bDic to current application’s NSTimeZone’s knownTimeZoneNames()
–>  (NSArray) {​​​​​”Africa/Abidjan”, ​​​​​”Africa/Accra”, ​​​​​”Africa/Addis_Ababa”​​​​​….​​​}

★Click Here to Open This Script 

2015/02/25 Conversion between UTCTime String and NSDate

Conversion ASOC script between UTCTime String (with milli-seconds) and NSDate.

In US Apple’s AppleScript Users ML, I saw the thread “UTC time with milliseconds”.

They talk about only current date -> UTCTime string (with milli-seconds) . And there is no care of each time zone.

So, I added time zone consideration and reverse conversion handler.

Reverse conversion (UTCTime string -> NSDate) does not need to get users time zone, I think.

Ole Begemann’s Working with Date and Time in Cocoa was very useful and helpful for me.

Shane Stanley taught me this is not right. Oh! my Buddha! (something like God..)

I misunderstood the definition of the word “UTCTime”. I meant it as a time string. So, I’ll fix this later. Hmm..I don’t need to get “UTCTime” string….Is there any need to get it?

AppleScript名:UTCTime StringとNSDateの相互変換
– Created 2015-02-24 by Shane Stanley
– Changed 2015-02-25 By Takaaki Naganoya
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set aStr to retUTCTimeString()
–>   “2015-02-25T13:49:55.713″

set aNSDate to retNSDateFromUTCString(aStr)
–>  (NSDate) 2015-02-25 13:49:55 +0000 –ASObjC Explorer
–> «class ocid» id «data optr0000000030F7400000600000» –Apple’s Script Editor

–Current Date -> UTCTime String
on retUTCTimeString()
  –There is need to get Current Calendar in my Time Zone
  
set aCalendar to current application’s NSCalendar’s currentCalendar()
  
set aTimeZone to (aCalendar’s timeZone)
  
set tDiff to (aTimeZone’s secondsFromGMT())
  
  
set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init()
  
  
theNSDateFormatter’s setDateFormat:“yyyy-MM-dd’T’HH:mm:ss.SSS”
  
theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneForSecondsFromGMT:tDiff)
  
  
return (theNSDateFormatter’s stringFromDate:(current application’s NSDate’s |date|())) as text
end retUTCTimeString

–UTCTime String -> NSDate
on retNSDateFromUTCString(aText)
  set aStr to current application’s NSString’s stringWithString:aText
  
  
set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init()
  
theNSDateFormatter’s setDateFormat:“yyyy-MM-dd’T’HH:mm:ss.SSS”
  
theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneForSecondsFromGMT:0)
  
  
return theNSDateFormatter’s dateFromString:aStr
end retNSDateFromUTCString

★Click Here to Open This Script 

2014/12/08 Remindersのイベントの期日を追加する

リマインダー(Reminders.app)の特定のreminderに対して、「期日」を追加するAppleScriptです。

Twitter上で、reminderに「場所」を追加できないだろうかという問いがあって・・・AppleScriptでは、リマインダー(Reminder.app)のAppleScript用語辞書には「場所」の予約語がないので、そのままでは手も足も出ません。ただ、ASOC経由でCocoaのEventKitにアクセスすれば、できそうな雰囲気がありました。

US AppleのAppleScript Users MLの過去ログをあさってみたら、きわめて近い内容のものがあったので、実際に試してみたら・・・OS X 10.10.1上ではエラーに。

ML上でShane Stanleyに聞いてみたら「10.10上では少々直す必要がある」とのことで、その場で教えてもらえました。ドキュメントを読めば分かる的な話ではあったのですが、Appleのオンラインドキュメントには定数の値が書かれていません(自分はここでスタックしていました)。

・・・どうやらShaneのいう「ドキュメント」とは「ヘッダーファイル」のことだったらしいことに後から気づきました。

# Script Editor上で編集中のAppleScriptのuse文をスキャンして、どのヘッダーファイルをオープンするかをユーザーに尋ねてオープンするAppleScriptを書いておく必要がありそう、、、

とりあえず、本Scriptでは「場所」ではなく「期限」を追加します。さらに調査を行えば、「場所」の追加もできそうですが・・・。

eventkit1.png

iCloud上の「ホーム」というリストにある(最新の)reminderに対して、「期限」を追加します。

eventkit2.png

AppleScript名:Remindersのイベントの期日を追加する
– Created 2014-03-08 by Shane Stanley
– Fixed 2014-12-08 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”
use framework “EventKit”

–とりあえず、1つのreminderのIDを取得
tell application “Reminders”
  tell account “iCloud”
    tell list “ホーム”
      set theID to id of (last reminder whose completed is false)
    end tell
  end tell
end tell

set theID to text 20 thru -1 of theID
–> “x-apple-reminder://B63F627B-A177-4CA7-9811-2AEB4875B407″
setDueDate_forReminderID_(((current date) + (2 * days)), theID)

on setDueDate:ASDate forReminderID:theID
  
  
– ASのdateをNSDateに変換
  
set theNSDate to my makeNSDateFrom:ASDate
  
  
– Cocoaのカレンダーを取得
  
set theCalendar to current application’s NSCalendar’s currentCalendar()
  
  
– Components of dateを取得
  
set theComponents to theCalendar’s componentsInTimeZone:(current application’s NSTimeZone’s localTimeZone()) fromDate:theNSDate
  
  
– get event store; 1 means reminders –> 2
  
set eventStore to current application’s EKEventStore’s alloc()’s initWithAccessToEntityTypes:2
  
  
– get the reminder
  
set theReminder to eventStore’s calendarItemWithIdentifier:theID
  
  
– 「期限」の日付を設定する
  
theReminder’s setDueDateComponents:theComponents
  
  
– 保存
  
eventStore’s saveReminder:theReminder commit:true |error|:(missing value)
  
end setDueDate:forReminderID:

on makeNSDateFrom:theASDate
  
  
set {theYear, theMonth, theDay, theSeconds} to theASDate’s {year, month, day, time}
  
  
if theYear < 0 then
    set theYear to -theYear
    
set theEra to 0
  else
    set theEra to 1
  end if
  
  
set theCalendar to current application’s NSCalendar’s currentCalendar()
  
set newDate to theCalendar’s dateWithEra:theEra |year|:theYear |month|:(theMonth as integer) ¬
    |day|:theDay hour:0 minute:0 |second|:theSeconds nanosecond:0
  
  
return newDate
  
end makeNSDateFrom:

★Click Here to Open This Script