Kinda. You can do `task due:today +calendar` to get a printout of stuff that's due today and tagged as "calendar" and you can tweak the columns it shows and ordering to show it exactly the way you want. I say "kinda" though because it's not exactly the same as a calendar in the sense you can't schedule a duration for a task because there is only an idea of "due time". In my mind, a calendar tracks when an event begins
and when it ends. You can create an appointment task that has the due time being the start of the appointment, but I don't think you can say "and it lasts until 3PM".
You can in general pre-define custom views with filters that show e.g. only high priority tasks due on the second Thursday of February that are dependencies of other tasks and then define exactly what you want it to show in its printout. It's also extensible and scriptable, so you can probably add custom hooks and such to do whatever you like. It also supports arbitrary user-defined attributes for a task, so if you really want to make it into a complete calendar you can add a user attribute to track the end time and then have it in a column of a custom calendar printout and maybe add hooks to prevent overlap or check that times are valid etc.
That said, I don't use it this way as it's just not what I want it for. But it can definitely do it; it's ridiculously flexible. Exactly how much calendar-like functionality you want determines how much work it'd take... ranging from none if you just want to track appointment start times for the day to a chunk of scripting if you really want a full-blown calendar.