カテゴリー: date

開始時刻から終了時刻までhh:mm形式の文字列を15分単位でリスト出力

Posted on by

指定の開始時刻から終了時刻まで、hh:mm形式の文字列を15分間隔でリスト出力するAppleScriptです。

ありもののサブルーチンを組み合わせて即席で作ったCocoa版のルーチンと、ChatGPT(GPT-5)に書かせた非Cocoa版のルーチンの2つがあり(ChatGPTにCocoa使用を指定せず)、速度を比較してみたら......

非Cocoa版のルーチンのほうが6倍ぐらい高速でした。データが小さすぎるとか、処理内容が小さすぎる場合にはCocoaの機能を利用しないほうが高速に処理できる場合があります。

Shane Stanleyの処理時間計測アプリ「ScriptGeek」が、かなりCocoa Scriptingの登場初期から存在しており、不思議に思ってきたものですが......処理内容の規模によってはCocoa Scriptingのほうが遅くなるケースがあるため、実際に書いて動かして計測してみないと、Cocoa Scriptingで高速化が達成できるかわからないところです。

このほか、AppleScriptのランタイム環境が何になるかによって実行速度は変わってきます。Xcode上で開発するCocoa Applicationなども実行特性が違うため、やはり動かして計測してみないと何がベストなのかはわかりません。

ただ、この程度の処理であれば、0.0028秒が0.4秒になったところで、何か実用上の差異が発生するわけでもありません。

追記:
追加で最速パターンを掲載しておきます。汎用性を求めて計算して出力していましたが、ほとんどの用途で毎回同じようなデータを出力することでしょう。なので、固定データを返すだけでいいだろうかと。高速版とくらべても65〜70倍ぐらい高速です(当たり前)。

AppleScript名:15分メッシュの時間文字列を生成.scptd

– Created by: Takaaki Naganoya
– Created on: 2025年08月13日

– Copyright © 2025 Piyomaru Software, All Rights Reserved

use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

set aRes to generateWorkUnitList() of me
–> {"5:15", "5:30", "5:45", "6:00", "6:15", "6:30", "6:45", "7:00", "7:15", "7:30", "7:45", "8:00", "8:15", "8:30", "8:45", "9:00", "9:15", "9:30", "9:45", "10:00", "10:15", "10:30", "10:45", "11:00", "11:15", "11:30", "11:45", "12:00", "12:15", "12:30", "12:45", "13:00", "13:15", "13:30", "13:45", "14:00", "14:15", "14:30", "14:45", "15:00", "15:15", "15:30", "15:45", "16:00", "16:15", "16:30", "16:45", "17:00", "17:15", "17:30", "17:45", "18:00", "18:15", "18:30", "18:45", "19:00", "19:15", "19:30", "19:45", "20:00", "20:15", "20:30", "20:45"}

on generateWorkUnitList()
set hList to {}

repeat with h from 5 to 20 by 1
repeat with m from 0 to 59 by 15
if {h, m} is not equal to {5, 0} then
set mStr to numToZeroPaddingStr(m, 2, "0")
set the end of hList to (h as string) & ":" & mStr
end if
end repeat
end repeat

return hList
end generateWorkUnitList

–整数の値に指定桁数ゼロパディングして文字列で返す
on numToZeroPaddingStr(aNum as integer, aDigit as integer, paddingChar as text)
set aNumForm to current application’s NSNumberFormatter’s alloc()’s init()
aNumForm’s setPaddingPosition:(current application’s NSNumberFormatterPadBeforePrefix)
aNumForm’s setPaddingCharacter:paddingChar
aNumForm’s setMinimumIntegerDigits:aDigit

set bNum to current application’s NSNumber’s numberWithInt:aNum
set aStr to aNumForm’s stringFromNumber:bNum

return aStr as text
end numToZeroPaddingStr

AppleScript名:15分メッシュの時間文字列を生成(高速).scpt

– Created by: Takaaki Naganoya
– Created on: 2025年08月13日

– Copyright © 2025 Piyomaru Software, All Rights Reserved

use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

set mList to retWorkingMeshStrList() of me
–> {"5:15", "5:30", "5:45", "6:00", "6:15", "6:30", "6:45", "7:00", "7:15", "7:30", "7:45", "8:00", "8:15", "8:30", "8:45", "9:00", "9:15", "9:30", "9:45", "10:00", "10:15", "10:30", "10:45", "11:00", "11:15", "11:30", "11:45", "12:00", "12:15", "12:30", "12:45", "13:00", "13:15", "13:30", "13:45", "14:00", "14:15", "14:30", "14:45", "15:00", "15:15", "15:30", "15:45", "16:00", "16:15", "16:30", "16:45", "17:00", "17:15", "17:30", "17:45", "18:00", "18:15", "18:30", "18:45", "19:00", "19:15", "19:30", "19:45", "20:00"}

on retWorkingMeshStrList()
set startSeconds to (5 * 3600) + (15 * 60) — 5:15 の相対秒
set endSeconds to (20 * 3600) — 20:00 の相対秒
set intervalSeconds to 15 * 60 — 15分間隔

set timeList to {}

repeat with t from startSeconds to endSeconds by intervalSeconds
set h to t div 3600
set m to (t mod 3600) div 60
— 2桁表示に整形
–set hStr to text -2 thru -1 of ("0" & h)
set hStr to h as string
set mStr to text -2 thru -1 of ("0" & m)
set end of timeList to (hStr & ":" & mStr)
end repeat

return timeList
end retWorkingMeshStrList

AppleScript名:15分メッシュの時間文字列を生成(最速).scptd

– Created by: Takaaki Naganoya
– Created on: 2025年08月10日

– Copyright © 2025 Piyomaru Software, All Rights Reserved

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

set hList to generateWorkUnitList() of me

on generateWorkUnitList()
return {"5:15", "5:30", "5:45", "6:00", "6:15", "6:30", "6:45", "7:00", "7:15", "7:30", "7:45", "8:00", "8:15", "8:30", "8:45", "9:00", "9:15", "9:30", "9:45", "10:00", "10:15", "10:30", "10:45", "11:00", "11:15", "11:30", "11:45", "12:00", "12:15", "12:30", "12:45", "13:00", "13:15", "13:30", "13:45", "14:00", "14:15", "14:30", "14:45", "15:00", "15:15", "15:30", "15:45", "16:00", "16:15", "16:30", "16:45", "17:00", "17:15", "17:30", "17:45", "18:00", "18:15", "18:30", "18:45", "19:00", "19:15", "19:30", "19:45", "20:00"}
end generateWorkUnitList

«class isot»が復活していた?

Posted on by

Mac OS X 10.5で、dateオブジェクトをISO日付形式に変換する«class isot»が動作しなくなっていました。

ISO日付テキストからdateオブジェクトへの変換が行えなくなる

[フレーム]

そして、もうこの機能はずっと動かなくなったままなのかと思っていましたが......現在動いていることに気づきました。

「AppleScript最新リファレンス」の初版執筆時には使えないことを確認していたので、OS X 10.11ぐらいの時代には動かなかったようです。

その後、手元の古いMacで確認してみたところ、

macOS 10.13:動く
macOS 10.14:動く

と、割と各バージョンで動いていることを確認。最新版のmacOS 15.5βでも動いています。


set testd to ((current date) as «class isot») as string
–> "2025年04月13日T22:28:56"

★Click Here to Open This Script

目下、この機能はPiyomaru Softwareの電子書籍に掲載しているコマンドリファレンスに記載していませんが、記述を復活させるべきか悩ましいところです。

個人的には、Cocoaの機能を用いてISO日付フォーマットとの相互変換を行なっています。

AppleScript名:ISO8601日付文字列を生成 v2.scptd
use AppleScript version "2.5"
use scripting additions
use framework "Foundation"

set aDate to getDateInternational(2022, 10, 21, 0, 0, 0, "JPT") –―year, month, date, hour, minute, second, time zone abbreviation.
–> date "2022年10月21日 金曜日 0:00:00"

set bStr to retISO8601DateTimeString(aDate, "JPT") as string
–> "2022年10月21日T00:00:00+09:00"

–NSDate -> ISO8601 Date & Time String
on retISO8601DateTimeString(targDate, timeZoneAbbreviation)
set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init()
theNSDateFormatter’s setDateFormat:"yyyy-MM-dd’T’HH:mm:ssZZZZZ" — Five zeds to get a colon in the time offset (except with GMT).
theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneWithAbbreviation:(timeZoneAbbreviation))
return (theNSDateFormatter’s stringFromDate:targDate) as text
end retISO8601DateTimeString

–Make a GMT Date Object with parameters from a given time zone.
on getDateInternational(aYear, aMonth, aDay, anHour, aMinute, aSecond, timeZoneAbbreviation)
set theNSCalendar to current application’s NSCalendar’s currentCalendar()
theNSCalendar’s setTimeZone:(current application’s NSTimeZone’s timeZoneWithAbbreviation:(timeZoneAbbreviation))
set theDate to theNSCalendar’s dateWithEra:1 |year|:aYear |month|:aMonth |day|:aDay hour:anHour minute:aMinute |second|:aSecond nanosecond:0
return theDate as date
end getDateInternational